大概知道一些思路了,试试内推网的爬取。
首先url的格式是:http://www.neitui.me/?name=neitui&handle=lists&keyword={KEY_WORD}&page={CUR_PAGE}
url后面问号跟着的是参数,等于号后面有值的是有效的参数,无值的可以省略;&是连接符号,用于连接参数的。
通过XPath提取页面,我今天才知道,原来在谷歌浏览器中用F12显示源码后,可以按Ctrl+F后,通过XPath表达式来查找目标,这样写完XPath表达式后就可以在页面上直接验证了,也容易判断能否化简表达式。
首先是获取指定岗位的总页数,通过分析源码知道源码中没有总页数这一条。分析页面
页面靠上部分会给出总职位数,每页固定28个职位,这样似乎可以通过(总职位数/28)+1 来得到页数。
但是,试了几个页面之后我发现,当总职位数超过1000时的显示就变成下面的样子了:
这样就不能通过除法得到页数了。
再观察页码部分
可以发现,如果没有下一页时,页面上没有向后的图标。分析源码可以通过
//div[@class="t_pagelink"]//a[@class="next"]
(分析后发现可以化简成//a[@class="next"])
来找到向后的图标。
这样就需要每抓取一页后分析是否还有下一页,如果有就继续抓取。
我先照着例子写了一个爬虫的代码,想先把response.body存储下来
from scrapy.spider import BaseSpider class NeituiSpider(BaseSpider): name = "neitui" allowed_domains = ["neitui.me"] start_urls = ["http://www.neitui.me/?name=neitui&handle=lists&keyword=Python&page=2"] def parse(self, response): filename = response.url.split("&")[-2].split("=")[-1] with open(filename, 'wb') as f: f.write(response.body)
结果,居然悲剧了....
获取的body根本不是我想要的,而是一段很短的内容。我估计是因为没有设置头部等信息导致出了错。下一步学习怎么自定义头部信息。
研究了半天,试出来设置headers的方法了
#encoding:utf-8 from scrapy.spider import BaseSpider from scrapy.http import FormRequest, Request class NeituiSpider(BaseSpider): name = "neitui" #allowed_domains = ["neitui.me"] start_urls = ["http://www.neitui.me/?name=neitui&handle=lists&keyword=Python&page=2", 'http://sou.zhaopin.com/jobs/searchresult.ashx?kw=python&sm=0&p=1'] def __init__(self): self.headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:41.0) Gecko/20100101 Firefox/41.0', 'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language':'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3', #'Accept-Encoding':'gzip, deflate', 'Connection':'keep-alive' } def start_requests(self): #该方法必须返回一个可迭代对象(iterable)。该对象包含了spider用于爬取的第一个Request。 for url in self.start_urls: yield FormRequest(url, headers = self.headers, callback = self.parse)#使用回调函数 def parse(self, response): filename = response.url.split("&")[-2] with open(filename, 'wb') as f: f.write(response.body)
注意:上面的#encoding:utf-8不能省略,否则会出错
然而,还是有问题
看状态码:智联招聘的获取成功了,但是内推网的失败了。
后来问了老师,告诉我是因为这个阿里云的IP访问的太频繁了,被识别出来是爬虫,然后被屏蔽了....