在日常中一个经常的需求是将不同来源的信息汇总,比如不同网站的求职信息。一般的架构是针对一个网站写一个爬虫,因为不同的网站的网页结构都不同,所以解析的方式甚至网站请求的方式也不同。如果全部写在一个模块中会有一些混乱。
但是一个比较好的克服的方法是采用类的结构来进行编写,因为类的扩展性比较好,可以对于不同的网站可以针对性的来修改,而且一个最大的好处是在基类中进行一些共有属性的定义可以大大减少重复的代码,提高代码的复用性。
按照以上的思路实现了一个基于类的初步的求职信息的爬虫。可以从应届生求职网和北大BBS的论坛爬取发布的招聘信息并存储在同一个CSV文件中。因为类的扩展性,所以后期需要修改和增加来源网站会比较方便。以下是实现过程:
首先定义了一个Basicrequest的父类,他包含了headers,url 和begin_date三个属性和getpage 及 save-to_csv两个方法,这个类主要是实现两个功能,一是构造请求头并返回页面信息,二是存储数据。这两个功能都是通用性质的,对于不同的网站没有不同,因此写在父类中可以有效的提高代码的重复使用,begin_date是希望以后可以通过该数值返回特定日期后的招聘信息,在此处暂无作用。
class Basicrequest():
def __init__(self,headers,url,begin_date=1):
self.headers = headers
self.url = url
self.begin_date = begin_date#input('请输入需要获取信息的起始日期')
def getpage(self):
webpage = requests.get(self.url,headers = self.headers)
webpage.encoding = webpage.apparent_encoding
doc = pq(webpage.text)
return doc
def save_to_csv(self,data):
df = pd.DataFrame(data).T
df.to_csv('Jobinfo.csv', mode='a', header=False,encoding='utf-8')
进群:548377875 即可获取数十套PDF,以及大量的学习教程哦!
接下来创造一个Yingjiesheng的子类,让他继承父类中的方法,同时增加一个函数来解析应届生求职网的页面,提取出发布求职信息的标题,链接,时间和来源,另外还定义了一个parsedetail函数,因为上面返回了求职信息的链接,所以其实是可以直接对明细的信息进行解析获取出如投递邮箱,简历命名等信息的,但其中需要涉及复杂和繁琐的正则提取,暂且放下这一块。最后我们调用了父类的save-to-csv将信息存储。
class Yingjiesheng(Basicrequest):
def __init__(self,headers,url):
super().__init__(headers,url)
def parsepage(self):
doc = self.getpage()
general_info = doc('.tr_list').items()
title, link, date, source = ([], [], [], [])
for g in general_info:
title.append(g('a').text())
link.append('http://www.yingjiesheng.com'+g('a').attr('href'))
date.append(g('.date center').text())
source.append(g('.cols2').text())
data = [title, link, date, source]
self.save_to_csv(data)
return title,link,date,source
def parsedetail(self,link):
pass
对于北大BBS上的信息我们采用相同的方法,确实通过类的方法只需要把关注点放在对于特定网站的提取上,基于类有一个更大的优点是对于某个网站来说即使请求头的要求不同,也只需要在该子类中重写它的请求属性而不会对其他的类产生影响。
class Pku_bbs(Basicrequest):
def __init__(self,headers,url):
super().__init__(headers,url)
def parsepage(self):
doc = self.getpage()
general_info = doc('html body div#page-content div#page-thread.page-thread div#board-body div#list-body.fw div#list-content.fw div.list-item-topic.list-item').items()
title, link, date, source = ([], [], [], [])
for g in general_info:
title.append(g(' div.title-cont.l div.title.l.limit').text())
link.append('https://bbs.pku.edu.cn/v2/' + g('a').attr('href'))
date.append(g(' div.author.l .time').text())
source.append('北大未名')
data = [title, link , date, source]
self.save_to_csv(data)
return title, link, date, source
def parsedetail(self,link):
pass
最后,我们将类进行实例化,并提取出两个网站前三页的信息,当然按照之前的设想提取某个日期后的信息其实更符合实际需要,但是爬取的时候是按照页来进行翻页爬取的,某个日期到第几页才结束也不好判断,所以暂且粗暴的循环。
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; …) Gecko/20100101 Firefox/60.0'}
for p in range(3):
yingjiesheng = Yingjiesheng(headers,'http://www.yingjiesheng.com/beijing-moreptjob-{page}.html'.format(page = p))
pkubbs = Pku_bbs(headers,'https://bbs.pku.edu.cn/v2/thread.php?bid=896&mode=topic&page={page}&_pjax=%23page-content'.format(page=p))
yingjiesheng.parsepage()
pkubbs.parsepage()
两个网站前三页共抓取到510条数据,数据格式如下:
需要源码的单独私信!
网友评论