您的位置:首页 > 编程语言 > Python开发

Python爬虫入门,抓取应届生求职网北京地区所有职位

2016-11-26 12:00 190 查看
    我也是刚刚入门Python爬虫,写这个一方面给和我一样的初学者一个参考,另一方面也希望有高手可以给我指导,一个人学习总是有些无聊的。其实任何语言的学习,我觉得最好的方式就是实战,看过太多理论,也不如实际撸一遍代码来的痛快,所以我就不去一一介绍那些用到的库啊函数啊什么的,网上资料一找一大把,我主要讲一讲整个过程中的思路吧。
    今天我们要抓取的就是应届生求职网北京地区的所有职位(http://www.yingjiesheng.com/beijing-morejob-1.html),这是第一页的网址,从网址上就可以猜到后面的数字代表了工作的页数,所以很容易想到根据网址遍历所有的网页,抓取其中所有的职位。其实最后的大目标是要抓取所有的职位及其详细信息,我们先完成第一步,抓取所有的职位及其详细信息的链接。
    第一步,我们先看看能不能直接用urlopen函数下载网页,需不需要设置用户代理等等。
import urllib2
url='http://www.yingjiesheng.com/beijing-morejob-1.html'
print urllib2.urlopen(url).read()

结果如下图所示



真是喜忧参半啊,高兴的是该网页不需要设置任何用户代理就可以直接下载,不开森的是下载的网页里面中文部分变成了一些奇奇怪怪的东西,所以编码肯定有问题。从下载的网页的第5行我们可以看到charset='gbk',原来网页的编码是gbk,而Python默认的是utf-8,所以肯定有问题。这个时候就要用decode-encode大法了,修改代码为

url='http://www.yingjiesheng.com/beijing-morejob-1.html'
print urllib2.urlopen(url).read().decode('gbk','ignore').encode('utf-8')

结果如下图所示



好的,这下中文显示正常了,可以开始愉快地抓取网页内容了。查看网页源码如下



第二步是网页内容提取。我们发现所有的职位及其链接都在标签td下,class=item1类的a标签下,其中链接是href属性,职位名称是a的文字内容,所以可以利用BeautifulSoup非常方便地抓取目标内容。

from bs4 import BeautifulSoup
content=urllib2.urlopen(url).read().decode('gbk','ignore').encode('utf-8')
bs=BeautifulSoup(content,'html.parser')
res=bs.find_all("td",{"class":"item1"})
site=item.find('a').attrs['href'].encode('gbk','ignore')
job=item.find('a').text.encode('gbk','ignore')

不过需要注意的是,网页中给出的职位链接相当一部分是相对链接,这样的话后面想下载职位具体内容时就会不方便,所以需要加一个判断来补全相对链接。最后一步就是存储了,将所有结果写入一个csv文件即可,最后的整体代码如下所示

__author__='CD'
# -*- coding: utf-8 -*-

import urllib2
from bs4 import BeautifulSoup
import csv

url="http://www.yingjiesheng.com/beijing-morejob-"
csvfile = file('links.csv', 'wb')
writer = csv.writer(csvfile)

for i in xrange(1,356):
url_total=url+str(i)+".html"
print 'Now downloading page '+str(i)
content=urllib2.urlopen(url_total).read().decode('gbk','ignore').encode('utf-8')
bs=BeautifulSoup(content,'html.parser')
res=bs.find_all("td",{"class":"item1"})
for item in res:
row=[]
site=item.find('a').attrs['href'].encode('gbk','ignore')
if "http" in site:
row.append(site)
else:
site="http://yingjiesheng.com"+site
row.append(site)
row.append(item.find('a').text.encode('gbk','ignore'))
writer.writerow(row)

下载结果如下图所示





这样就完成了我们第一步的目标,爬取到了所有的职位及其链接,不过这个爬虫问题还是挺多的,主要以下几个

1 职位其实是在不停地更新的,用页数作为遍历的依据很可能导致爬取职位不全,用下一页的链接可以解决这个问题。

2 爬虫执行两次之后就被封ip了,所以有必要在爬取的时候也增加延迟或者使用多个代理ip。

    不过没有关系,接下来我们会进一步修改这个爬虫,直到它完成我们最终的目标。

注:代码仅供学习交流使用,如有错误请多指正。

PS:第一次发格式来来回回改了好几遍,为什么写的东西总自己进了代码里啊……
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python 爬虫 求职