scrapy笔记
2018-04-13 本文已影响0人
GaGLee
1 scrapy的运行原理
参考:
Learning Scrapy笔记(三)- Scrapy基础
Scrapy爬虫入门教程四 Spider
spider就是你用来定义对某个特定网站的爬取动作的工具,他的爬取循环类似于这样:
1、 首先要将你指定的初始URL封装成Request对象,并且要指定在网页返回该请求的内容后应该用哪个函数来处理网页的内容response。这个函数就是callback回调函数。
默认情况下,会调用start_requests()函数,对start_urls中的URL分别生成一个Request对象,并且指定parse()函数作为回调函数(回调函数指的是callback变量指定的函数)
2、 在回调函数中,可以处理response变量,然后返回一个已经提取好数据的字典或者是一个Item对象,或者是Request对象(在这个Request对象中,也可以指定一个回调函数,同样地,处理完这个Request之后生成的response就会传送到回调函数中处理)
3、 在回调函数中,也可以提取网页内容,通常使用Selector(也可以使用BeautifulSoup,lxml或者其他你熟悉的机制)来生成包含了解析数据的item
4、 最后,这些从spider中返回的item通常会存入到数据库中,或者写入到文件中
2 双向爬取
参考:
- Scrapy Learning笔记(四)- Scrapy双向爬取
-
爬虫入门(5)-Scrapy使用Request访问子网页
这篇文章中虽然是主页面、子页面,但是只有一个主页面,没看见在主页面之间继续跳转,所以其实就是单向爬取,
- 水平方向:从一个索引页到另一个索引页,主页之间
- 垂直方向:从一个索引页到条目详情页,主页到子页
要点提示
-
import部分
因为要在parse()解析response中嵌套request子网页的url,并取得它的response,并进行解析提取,因此:
在通常import Item的基础上,
from daomubiji.items import DaomubijiItem
还需要import如下:
import scrapy
from scrapy.spiders import Spider
from scrapy.selector import Selector
from scrapy.http import Request
-
def parse()方法+新增def parse_son(self,response)方法
在原def parse()方法的基础上,还需要新增def parse_son(self,response)方法用于提取子页面的信息。
而且,通常是先定义def parse_son(self,response),再定义def parse()
但是,需要知道的是:函数起初肯定还是从def parse()开始执行 -
def parse_son(self,response)的核心格式
该方法的目的就是返回yield item,不然就没意义了。
注明:item在任何时候返回都可以,没有限制 -
def parse(self,response)的核心格式
核心思想:把每个主页面内的子URL,和主页面之间跳转的主URL平等对待,只是在最后一个子URL后增加一个if判断,设两个不同的yield。并不是在主parse中嵌套子URL的request和parse_son请求和提取循环!!!
该方法返回值需要用if设两个yield:
if 不是当前主页中最后一个子URL
则yield Request(子页面的url, callback=self.parse_son)
else yield(主页面的URL,callback=self.parse)
误区解释:scrapy的工作原理是将每个完整parse运行完成后,返回一个URL,将这些URL组成列表而依次读取。重点:这跟URL是在主parse中yield返回,还是在子parse_son中yield返回没有关系,即可以在主parse中返回下一个循环的URL,而并非一定要在子parse_son的末尾(此处为当前整个主parse的运行尾端)返回下一次的URL,而在这里可以只返回item!!!