人生苦短,我用Python(二)— 爬取会议网站 EasyChair Smart CFP

news/2024/5/20 1:55:07/文章来源:https://blog.csdn.net/llllllyyy/article/details/81613285

寒假留校帮学长写了个爬虫,抓取会议网站上一些CFP信息。想着把一些知识点、坑点记下来,一来做个小总结给工作收收尾,二是以后再遇到好从容应对。

这是我写的第二个比较完善的爬虫了,比第一个要简单许多,完全过程化的代码,而且easychair这个网站页面布局比较友好,适合python新手、前端小白入门练习。但这个网站反爬比较厉害,写爬虫的过程中就被ban了好几次……

制定抓取策略

目标网站:https://easychair.org/cfp/area.cgi

要抓取的CFP信息按照Area分成24类,随便点开几个链接看看我们要抓取的页面是怎样的。

首先是下方的表格,包含六个字段和一个url链接:
页面布局
然后多开几个Area,观察它们的url格式:
url1.png
url2.png
发现了吗?不同的就是只有最后的数字而已,可以把它们理解成不同的页码。

根据上面的分析,我们已经清楚了要爬取的具体内容,即24个Area页面,每个页面中有一个表格,每条CFP信息中包含7个字段(6个可见字段+一个url链接)。

所以,我们的抓取策略就是:遍历24个Area页面 → 抓取表格信息 → 写入文件或存数据库。是不是很简单?→_→

Ps:(很重要,敲黑板)

写一个爬虫,一定是从思路开始的,也就是从制定抓取策略开始的。一定要搞清楚自己的爬虫要做什么,复杂度大概是怎样的,需要有哪几部分的功能,是否需要模块化编程……虽然有很多优秀的爬虫框架,但别人写的东西并不是随便拿来就能用的,对于不同的网站,布局不同,前端所用的技术不同,下载解析过程中可能遇到的问题更是不尽相同,而且你的问题坑点别人也未必遇到过。记得实验室大佬曾经说过一句话:“我很想帮你,但事实上我什么也帮不了你。”

编写框架代码

根据我们制定的抓取策略,我们写出以下代码:

import urllib2for num in range(1,25):url = 'https://easychair.org/cfp/area.cgi?area=' + str(num)headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}try:# 下载网页request = urllib2.Request(url, headers=headers)response = urllib2.urlopen(request)html = response.read()response.close()'''解析网页,抓取字段''''''写入文件或数据库'''    except urllib2.URLError, e:if hasattr(e, 'code'):print e.codeif hasattr(e, 'reason'):print e.reason

Ps:

  • 如果按照上面的代码写文件,最终应该生成24个文件,也就是说每次循环写入的文件名应该随num的改变而改变,不然最后只有num=24的CFP信息。
  • 如果想把所有信息写入一个文件,把write部分代码放在循环外面就行啦。

利用 lxml 库抓取字段

先简单介绍一下 lxml 库。

它使用的是XPath语法,即XML路径语言,功能是网页解析。同样能实现网页解析功能的还有正则表达式、BeautifulSoup库,各有优劣,一些复杂情形下也会配合使用。一般来说,lxml 的解析速度要优于BeautifulSoup,但语法相对复杂(不过这个不是问题,浏览器早帮我们写好了→_→),至于正则,你得去记规则啊!!!正则能用得很流畅的绝逼大神了。。。

然后利用强大的Chrome浏览器,在要匹配的html代码处右键,点击Copy XPath就得到需要的路径表达式啦!
copyxpath.png
Ps:
如果发现提取出的XPath匹配为空,原因是Chrome会自动添加标签,去掉即可。

关于 lxml 库的安装和XPath语法,网上有许多讲解很详细的教程、博客,这里推荐一下极客学院的python课程:http://www.jikexueyuan.com/course/902.html,老师用的例子非常简单生动,十分钟就可以基本掌握。

个人觉得最最基础的就是下面四个啦:

  • // 定位根节点
  • / 下层寻找
  • /text() 提取文本内容
  • /@xxx 提取属性内容

还有两种比较常用的特殊用法:

  • //*[starts-with(@id,”row”)] 提取id属性以row开头的标签内容
  • xpath(‘string(.)’)处理标签套标签的情况,不过我一般喜欢写成xpath(‘string(.)’).replace(‘\n’,”).strip()),去掉换行符和字段前后的空格

掌握上述几种用法,看懂下面的代码就没什么问题了:

from lxml import etree'''lxml 抓取字段
'''
selector = etree.HTML(html)# 提取area    //*[@id="content"]/div[2]/div[@class="pagetitle"]
area = selector.xpath('//*[@id="content"]/div[2]/div[@class="pagetitle"]/text()')[0].replace('CFPs in ','')# 行:  //*[@class="yellow"]
rows = selector.xpath('//*[starts-with(@id,"row") and @class="yellow"]')
# 列
tds = []
for row in rows:tds.append(row.xpath('td'))  #tds是一个大小等于行数的列表,其中每个元素td是大小为6的列表
link = [] 
acro = []
name = []
loca = []
dead = []
star = []
topi = []
for td in tds:# 下面都是长度等于行数的列表,分别是抓取的7个字段link.append(td[0].xpath('a/@href')[0])acro.append(td[0].xpath('string(.)').replace('\n','').strip())#name.append(td[1].xpath('string(.)').replace('\n','').strip())name.append(td[1].xpath('text()')[0])loca.append(td[2].xpath('string(.)').replace('\n','').strip())dead.append(td[3].xpath('string(.)').replace('\n','').strip())star.append(td[4].xpath('string(.)').replace('\n','').strip())topi.append(td[5].xpath('a/span/text()'))# 利用zip()函数组合上面各列表,最后加一个area字段
zipped = zip(acro, name, link, loca, dead, star, topi, [area]*len(acro))

写文件操作

将zipped写入csv文件:

import csv
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
# 写入文件
with open(str(num)+" "+area+".csv","wb") as f: writer = csv.writer(f)#先写入表头  Acronym (link), name, location, deadline, start_date, topicwriter.writerow(["Acronym","Name","Link","Location","Submission deadline","Start date","Topics","Area"])#写入多行用writerowswriter.writerows(zipped)

Ps:

  • sys.setdefaultencoding(‘utf-8’)解决编码错误UnicodeEncodeError,但这种一劳永逸的做法并不妥当,详情可以看下这篇博文:https://blog.ernest.me/post/python-setdefaultencoding-unicode-bytes。
  • 以“wb”方式打开文件,防止出现空行。
  • 这种把列表写入文件的操作比较简单,但仅适用于抓取的字段数目是确定而且比较一致的情况。有时候我们的任务需求可能是“抓取所有字段”(博主接到的就是这样的要求(⊙﹏⊙)),比如某条CFP有截止日期字段,但另一条CFP可能还未发布截止日期,这时候我们就要利用字典代替列表去存数据,然后把字典写入文件。后续的博文会介绍到这种操作……

爬取结果展示

  • 运行结果:
    run1.png
  • 24个csv文件:
    run2.png
  • 文件内容:
    run3.png

GitHub源码

https://github.com/lyandut/CrawlerEasychair.git

最后

其实这个爬虫只是爬了24个大小不同的表格而已,没有进入每个CFP具体的页面,并没有爬出所有字段,所以下篇博文会给大家展示一个全新的爬虫,CrawlerEasychair2.0版。

小剧透一下:2.0版会从本文已经爬取的Link字段入手,涉及到队列、字典写入文件等操作……
zhuangbi.jpg
综合楼4F

18/02/01晚

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_850962.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

由12306.CN谈谈网站性能技术http://coolshell.cn/articles/6470.html

由12306.CN谈谈网站性能技术 2012年01月16日 陈皓 评论 340 条评论 163,061 人阅读 12306.cn网站挂了,被全国人民骂了。我这两天也在思考这个事,我想以这个事来粗略地和大家讨论一下网站性能的问题。因为仓促,而且完全基于本人有限的经验和…

搭建VueJS2.9+ElementUI单页面网站,编写导航页,导航栏跳转、切换

对于一个单页面应用来说,导航页是至关重要的一个页面,所有的组件都会在这个页面里进行显示。先看效果图,文章最下边有我的模板源代码下载路径。接下来我们就开始进行导航页的开发。 1、安装vue-router 搭建vue环境时装过的忽略此步骤。在…

大型网站系统架构分析

本文转载自博客 Mainzs Blog 感谢作者的辛勤劳动成果过 大型网站系统架构分析 千万级的注册用户,千万级的帖子,nTB级的附件,还有巨大的日访问量,大型网站采用什么系统架构保证性能和稳定性? 首先讨论一下大型网站需…

大型网站架构演变和知识体系

(原文:http://www.blogjava.net/BlueDavy/archive/2008/09/03/226749.html)之前也有一些介绍大型网站架构演变的文章,例如LiveJournal的、ebay的,都是非常值得参考的,不过感觉他们讲的更多的是每次演变的结…

大型网站架构

这里转载几篇关于大型网站架构方面的内容,以便日后细细品读。一下内容均来自Mainzs Blog 架构设计之性能设计经验 性能(performance)设计非常重要,对于服务器端实时交易系统来说系统性能的重要性不言而喻,对客户端软件来说性能好的软件也…

IIS6.1无法发布vs2010开发的网站若干问题的解决方案

1、未能加载文件或程序集“XXX”或它的某一个依赖项。系统找不到指定的文件 基本的思路是缺少某个引用的文件,出现类似的错误有多种情况。说一下我这里出现这种情况的原因 由于做项目时web.config文件需要一些配置,比如说Form认证,所以我直接…

大型网站系统架构演化之路

前言 一个成熟的大型网站(如淘宝、京东等)的系统架构并不是开始设计就具备完整的高性能、高可用、安全等特性,它总是随着用户量的增加,业务功能的扩展 逐渐演变完善的,在这个过程中,开发模式、技术架构、设…

简单登录网站的搭建(未完成)

简单登录网站搭建 题干: 自己写一个登陆页面,并能实现对接数据库,判断用户名与密码是否正确。 步骤: 我这里并没有完整的搭建成功 只是进行了前后端代码的编写 (PHPSTUDY的环境没搭建好 没能成功的连接上数据库&am…

推荐四个在线任务管理网站

推荐四个在线任务管理网站 Posted on 2008-01-11by David Zou 现在通过网上协作完成的任务是越来越多了。 Capote movies 网络协作的优势不言而喻: 不需要在乎对方的学历、年龄、性格、相貌等等,只要你们有想要完成同一件事情,就可以进行网络…

在RHEL8的系统上搭建网站

在rhel8的系统上搭建网站:该网站ip地址主机位为11,设置documentroot为/www/任意字母,网页内容为:my name is… 准备工作:配置yum源 更新httpd 开始操作: 启动服务: 查看状态: 查…

基于ASP.NET和Sql Server实现的读书平台网站

1 课程设计目的 综合运用软件工程思想、面向对象分析和设计方法、ASP.NET、数据库等基础知识,完成一个B/S架构的Web应用程序,掌握应用ASP.NET技术开发中小型网站的相关知识和技术。 2 课程设计内容 针对一个咸鱼读书网系统项目需求,利用数据库管理系统…

基于HTML实现的游戏专题网站

摘 要大观园系列是游民星空出品的向广大用户提供了解新上市游戏的方便途径,上玩家直观的看到游戏界面,内容,人物设定,剧情等重要信息,促使玩家购买。提供方便的同时,也增加了网站浏览量。大观园&#xff1a…

小说网站-包括PC版本和移动版本

一、网站简介1.1 设计思路根据一般人阅读小说的顺序,利用了HTML5、CSS3制作一个普通pc端和跨平台移动端。PC端:小说的首页、小说某类具体信息、某小说详细信息页移动端:小说的首页、小说分类、小说某类具体信息、小说详情1.2 网站的主体功能小…

好客租房67-render-props模式-3演示mouseover的组件的复用

//导入react import React from react import ReactDOM from react-dom//导入组件 // 约定1:类组件必须以大写字母开头 // 约定2:类组件应该继承react.component父类 从中可以使用父类的方法和属性 // 约定3:组件必须提供render方法 // 约定4:render方法必须有返回值…

10天学会Web标准建站

目录: 使用Web标准建站第1天:选择什么样的DOCTYPE 使用Web标准建站第2天:什么是名字空间 使用Web标准建站第3天:定义语言编码 使用Web标准建站第4天:调用样式表 使用Web标准建站第5天:XHTML代码规范 使用We…

阿里云CDN网站违规URL屏蔽访问处理方案

阿里云CDN网站违规URL屏蔽访问处理方案 今天收到阿里云cdn的通知: 尊敬的****XXX.com:您的网站URL:http://XXXX.XXXXX.com/XX/XXX/XXX.apk涉及违法不良信息,违反了相关服务协议和《互联网信息服务管理办法》第十五条规定&#x…

提高网站速度的最佳实践

相信互联网已经越来越成为人们生活中不可或缺的一部分。ajax,flex等等富客户端的应用使得人们越加“幸福”地体验着许多原先只能在C/S实 现的功能。比如Google机会已经把最基本的office应用都搬到了互联网上。当然便利的同时毫无疑问的也使页面的速度越来越慢。自己…

大型网站架构演变和知识体系

在这篇文章中将阐述一个普通的网站发展成大型网站过程中的一种较为典型的架构演变历程和所需掌握的知识体系,希望能给想从事互联网行业的同学一点初步的概念。 之前也有一些介绍大型网站架构演变的文章,例如LiveJournal的、ebay的,都是非常值…

介绍一款开源、高性价比的在线教育建站系统

今天给大家介绍一款开源在线教育建站系统——edusoho,项目是用PHP开发,所以基本上会搭建php站点就可以完成本次的搭建。 先看看安装之后的登录界面。 去官网下载源码 笔者下载企培开源版:edusoho-ct-21.4.5.zip 系统说明 1.系统&#xff1…