腾讯手游助手cf按键
背景
作为前无古人后有来者的UX方向硕士,经过不到一年的学习,到了写毕业论文开题报告的阶段。由于平时学习重点在项目实战,所以到了写学术文章的时候突然忘记如何下手。本文用一个Python小爬虫爬取了CHI近四十年来所有文章的摘要,并用Markdown生成阅读友好的PDF文件,并为英文不好的同学(比如我)使用百度翻译API自动翻译了摘要全文。
为什么选择CHI
CHI全称 ACM SIGCHI计算系统中的人因学会议(ACM SIGCHI Conference on Human Factors in Computing Systems)(但是依然没搞懂是哪三个词的简写),是人机交互(Human-Computer Interaction)领域内最经典的学术会议。在中国计算机学会推荐的国际学术会议目录(人机交互与普适计算)中属于A类。CHI2017在丹佛举行,所有摘要,尽在文末。
什么是爬虫
登录cf游戏助手
苹果cf准星助手
爬虫就是一个可以批量保存互联网信息的程序,对于爬虫最常使用的隐喻是蜘蛛,在网上爬来爬去,碰见自己的猎物就拿回来。一般情况下爬取的大量数据会被进一步做数据挖掘,本文的爬虫爬取的大量文章摘要暂时只做结构化输出便于阅读,进一步的自然语言处理会在不久的将来进行。
爬虫代码
Python新手,采用函数式编程,代码也不够简洁,但是足够完成目标。代码托管在Github,同时也写了Science、Nature、Springer、Google Scholar的爬虫,有兴趣的可以Fork,一起优化代码。对代码无感的人可以跳过这一部分了。
frombs4importBeautifulSoupimportreimportstringimportrequestsimporthashlibimportjsonimporturllibimportrandom首先导入需要的模块然后定义获取HTML内容的函数defgetHTMLText(url,code=utf-8):try:headers={User-Agent:Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6}r=requests.get(url,headers=headers)r.raise_for_status()r.encoding=codereturnr.textexcept:return这段代码是从网上找的,用来对HTML进行初步清洗,以防使用soup.sibling()的时候出现空白defbs_preprocess(html):"""remove distracting whitespaces and newline characters"""pat=re.compile((^[s]+)|([s]+$),re.MULTILINE)html=re.sub(pat,,html)remove leading and trailing whitespaceshtml=re.sub(
,,html)convert newlines to spacesthis preserves newline delimitershtml=re.sub([s]+<,<,html)remove whitespaces before opening tagshtml=re.sub(>[s]+,>,html)remove whitespaces after closing tagsreturnhtml定义寻找会议名称以及地点的函数,并且替换字符串中不适合做文件名的符号defconference_name(soup):name=soup.find_all(table,class_=medium-text)[4].get_text()exclude=set(string.punctuation)name=.join(chforchinnameifchnotinexclude)return.join(name.split())下面这几个函数可能会有些费解,因为爬取网页中的id或者class很少,所以只能根据其他的属性判断内容session是会议中的分主题,一个session下会有若干文章,以下函数判断一个session中有几篇文章defhow_much_articles(soup):i=0try:soup=soup.next_siblingwhilenotis_session(soup):ifis_title(soup):soup=soup.next_siblingi+=1else:soup=soup.next_siblingexcept:print(last session)returni判断一个标签的内容是不是sessiondefis_session(soup):try:ifsoup.find(td,colspan=2):returnTrueexcept:returnFalse判断一个标签是不是包含文章标题defis_title(soup):try:ifsoup.find(td,colspan=1):returnTrueelse:returnFalseexcept:returnFalse判断一个标签是不是包含文章摘要defis_abstract(soup):try:ifsoup.find(span,id=True):returnTrueelse:returnFalseexcept:returnFalse提取标签中的文章标题deffind_title(soup):try:returnsoup.find(a).textexcept:print(where is the title???????????????????????????????????)returncan not find title提取文章标题中的原文链接deffind_link(soup):try:returnhttps://dl.acm.org/+soup.find(a)[href]except:print(can not find link)returncan not find link以列表的形式提取作者deffind_author(soup):authors=[]forauthorinsoup.find_all(a):authors.append(author.text)returnauthors提取文章的页码deffind_pages(soup):try:returnsoup.find(span).text[7:]except:print(can not find pages)returncan not find pages提取文章的摘要deffind_abstract(pages_soup):try:pages_soup.find(span,id=re.compile("toHide")).get_text()except:return定义翻译函数,调用百度翻译的API,appid和secret_key请自行申请(免费的)deftranslate(q):appid=your_appidsecretKey=your_secretKeymy_url=http://api.fanyi.baidu.com/api/trans/vip/translatefromLang=entoLang=zhsalt=random.randint(32768,65536)sign=appid+q+str(salt)+secretKeym1=hashlib.md5()m1.update(sign.encode())sign=m1.hexdigest()my_url=my_url+?appid=+appid+&q=+urllib.parse.quote(q)+&from=+fromLang+&to=+toLang+&salt=+str(salt)+&sign=+signtry:r=requests.get(my_url)response=r.contentjson_data=json.loads(response)returnjson_data[trans_result][0][dst]exceptExceptionase:returnstr(e)以下就是主函数了,输入会议的url,输出内容的Markdowndefdownload_proceedings(url):html=getHTMLText(url,code=utf-8)html=bs_preprocess(html)建立soupsoup=BeautifulSoup(html,html.parser)print(soup ok)file_name=conference_name(soup)[24:]寻找文章的列表articles_table=soup.find_all(class_="text12")[1]print(articles_table ok)session_tds=articles_table.find_all(td,colspan=2)article_tds=articles_table.find_all(td,colspan=1)session_num=len(session_tds)article_num=len(article_tds)print({}sessions {}articles.format(str(session_num),str(article_num)))articles=[]article_from=0早期的年份没有session,所以增加if判断,session为零就直接下载文章ifsession_num:foriinrange(session_num):abstract_steps=i+2session_name=session_tds[i].parent.get_text()num_of_articles=how_much_articles(session_tds[i].parent)article_to=article_from+num_of_articlesforiinrange(article_from,article_to):article_info={}title_tr=article_tds[i].parentarticle_info[session]=session_namearticle_info[title]=find_title(title_tr)article_info[link]=find_link(title_tr)print(title and link found)article_info[author]=find_author(title_tr.next_sibling)article_info[pages]=find_pages(title_tr.next_sibling.next_sibling)try:article_info[abstract]=soup.find(span,id=toHide{}.format(str(i+abstract_steps))).get_text()except:article_info[abstract]=can not find Abstractprint(can not find abstract)articles.append(article_info)print({} article{} finish.format(session_name,str(i+1)))article_from=article_to有session的会议中,第一个标签一定是session,然后判断此session有几篇文章,借此确定文章列表的索引范围,依次迭代else:foriinrange(article_num):article_info={}title_tr=article_tds[i].parentarticle_info[title]=find_title(title_tr)article_info[link]=find_link(title_tr)print(title and link found)article_info[author]=find_author(title_tr.next_sibling)article_info[pages]=find_pages(title_tr.next_sibling.next_sibling)try:article_info[abstract]=soup.find(span,id=toHide{}.format(str(i+1))).get_text()except:article_info[abstract]=can not find Abstractprint(can not find abstract)articles.append(article_info)print(article{} finish.format(str(i+1)))withopen("{}.md".format(file_name),"w")asf:foriinrange(len(articles)):f.write({}..format(str(i+1))+articles[i][title]+
)f.write(*+articles[i][session]+*
)f.write(articles[i][abstract]+
)f.write(>+translate(articles[i][abstract])[0]+
)f.write(>[article link](+articles[i][link]+)
)if__name__==__main__:如果想要批量下载,就把所有连接做成url列表,用for循环来保存url=https://dl.acm.org/citation.cfm?id=3025453&preflayout=flatdownload_proceedings(url)
结果
运行上述代码会在相同文件夹下生成md文件,然后选择自己熟悉的Markdown(Mac下推荐MacDown)编辑器,看看格式有没有问题,就可以开始泛读了。读到感兴趣内容的可以点开文章的链接,里面会有30秒的视频演示(部分有)。想看文章全文的可以看看学校有没有购买ACM的数据库。2017CHI的PDF放在了GitHub的项目中,只看结果的人可以直接下载来看,效果如下图。有什么好的UX领域的学术资源也可以推荐给我,希望大家开题顺利。
CF刷枪皮肤助手不封号