【飞谷六期】爬虫项目2

大概知道一些思路了,试试内推网的爬取。

首先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访问的太频繁了,被识别出来是爬虫,然后被屏蔽了....

原文地址:https://www.cnblogs.com/dplearning/p/4903238.html