1. 上篇文章大致了解scrapy的流程,生成了lagou.py爬虫文件,接着看看爬虫文件的内容:
    scrapy爬虫教程(二)--第一个爬虫
    通过上图看出爬虫是继承自scrapy.Spider,在进入到Spider中找到入口函数start_requests
    scrapy爬虫教程(二)--第一个爬虫
    爬虫就是通过这里作为入口创建request对象,通过引擎发送给调度器,下载器获取到request进行下载,生成response发送给爬虫的parse函数进行解析
    scrapy爬虫教程(二)--第一个爬虫
    父类scrapy.Spider中要求必须在子类中实现parse方法,因此我们看到第一张图上生成了parse方法,并且该方法接收来自下载器的response,通过断点调试可以看到成功返回了response对象,并且下载到了我们需要的内容
    scrapy爬虫教程(二)--第一个爬虫
    scrapy爬虫教程(二)--第一个爬虫
    通过返回的页面,我们来使用xpath提取职位详情页面的url
    scrapy爬虫教程(二)--第一个爬虫
    通过上图的断点调试看到我们已经成功提取出职位详情的url为https://www.lagou.com/jobs/6831474.html,访问该页面:
    scrapy爬虫教程(二)--第一个爬虫
  2. 这里我们只是提取到页面的URL,如果需要继续提取详情页的职位信息该怎么做呢?
    通过图二可以看出start_requests方法是通过yield出一个request对象到调度器,然后下载,这里我们也就可以模仿这种方式,from scrapy.http import Request导入request类
    scrapy爬虫教程(二)--第一个爬虫
    看上图request类源码可以看出,创建实例对象至少需要传递一个URL,那么我们先尝试只传递一个URL参数会是什么结果呢?同样在parse中进行断点调试:
    scrapy爬虫教程(二)--第一个爬虫
    上图为初始执行请求lagou.com,爬虫通过引擎回去到了response对象,并提取出了详情页的URL,然后将URL传进request对象中并yield出去,继续执行
    scrapy爬虫教程(二)--第一个爬虫
    parse方法再次获取到一个response对象,这里访问了一个forbidden页面,表示没有权限,这是由于爬虫协议,该站点禁止爬虫访问详情页,这里暂时不解决这个问题,当做正常处理,稍后文章说明处理方式;通过上面可以分析知道,如果yield出一个request对象如果只是传递URL参数,那么爬虫引擎会将response对象传递给parse方法,这样做就要在parse中区分首页和详情页,然后再做进一步处理,但是这么做会parse方法变得臃肿、可读性低,因此我们单独写一个方法进行详情页数据提取,如何才能将response传递给我们自己写的方法中呢?将request对象中传入callback参数,该参数为自定的解析方法:
    scrapy爬虫教程(二)--第一个爬虫
  3. 由于爬虫协议限制和反爬机制,使得正常访问需要关闭爬虫协议,并且设置请求头,关闭爬虫协议在settingsROBOTSTXT_OBEY = False,在parse方法中写入headers并传给request对象
    scrapy爬虫教程(二)--第一个爬虫
  4. 所有需要的页面都已经可以成功获取,那么我们就来提取数据吧:
    scrapy爬虫教程(二)--第一个爬虫
    此处只少量提取三条信息作为示范

相关文章: