scrapy 简述
scrapy是一个爬虫框架,其原理图如下(绿色箭头是数据流向):
简单分析一下这张图:
1.Spiders是爬虫文件,有两个作用,一是把要爬取的网址的Requests发给引擎,引擎再发给调度器。二是处理下载器发送回来的Response。解析Response,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器).
2.Scrapy Engine是爬虫引擎,负责Spider、ItemPipeline、Downloader、Scheduler中间的数据传递。
3.Scheduler是爬虫调度器,因为我们不会只爬取一个网页,调度器的作用就是把我们要爬去的所有网页的Requests排好队,一个一个的爬,所以调度器其实就是一个队列。
4.Downloader是下载器,负责处理引擎发送的所有Requests请求,并将Requests获取到的Responses交还给引擎,再由引擎交给Spiders来处理。
5.Item Pipeline是管道文件,其实这个对新手非常不友好,根据图片,我们可能会觉得Item Pipeline是一个文件,但是在真正的scrapy项目中,管道文件是两个文件,一个叫items.py,个人理解这个文件就是写出自己想获得哪些item(数据),即项目的目标文件。而另一个文件pipeline.py就是处理item.py中item,即过滤,储存item.py中的item。
6.Spider Middlewares是爬虫中间件,你可以理解为是一个可以自定扩展和操作引擎和Spider中间通信的功能组件。
7.Downloader是下载中间件,你可以当作是一个可以自定义扩展下载功能的组件。下载中间件的作用一般来说就是实现随机请求头和ip代理池。
scrapy流程
简单说一下scrapy的一般流程:爬虫文件Spiders把网页的Requests发送给引擎,引擎把接收到的Requests交给调度器排队,调度器把排好队的Requests交给引擎,引擎再把Requests交给下载器,下载器返回每个Request对应的Response给引擎,引擎拿到Responses并把它交给爬虫文件Spiders经行解析,然后分情况,第一,没有需要跟进的URL,直接将Spiders解析的结果交给引擎,引擎再交给Item pipiline进行处理。第二种情况,就是要跟进URL,那么就会把Spiders解析的结果和跟进的URL的Requests交给引擎。引擎把解析的结果交给Item pipiline进行处理,把Requests交给调度器,然后就和上面一摸一样了,直到所有的Requests都处理完,爬虫结束。
是不是感觉引擎就像是一个工具人。。。
scrapy安装(仅Windows)
一般来说就直接在cmd中用 pip install scrapy就行了,如果报错的话,就试试下载pypiwin32,lxml这两个库
快速开始
制作scrapy爬虫需要4步:
1.新建项目
2.创建爬虫文件
3.制作爬虫
4.存储内容
创建项目
先创建一个文件夹,最好创建在自己的pycharm中,就不用再添加python解释器了。然后右键,点击CmdHere。如果你没有这个选项,请先看这个大神的博客:
如何在电脑中添加CmdHere
然后注意,每次自己的电脑更新后就要重复一次上面的博客中的操作。
完事之后输入命令,
命令为
scrapy startproject douban250
douban_top250是项目名,根据自己的爬虫项目取名字
创建爬虫文件
创建完项目后,输入命令进入项目
cd douban250
之后创建爬虫文件
scrapy genspider douban_spider "movie.douban.com"
first_spider是爬虫文件名, "movie.douban.com"是我们爬取的豆瓣top250的域名。
制作爬虫
首先,明确我们要爬去的数据,然后用pychram打开我们的爬虫项目,打开item.py这个文件,把自己想要获取的数据写上去
movie_name = scrapy.Field()
movie_director_actors = scrapy.Field()
movie_time_country = scrapy.Field()
movie_grade = scrapy.Field()
comment_number = scrapy.Field()
movie_introduce = scrapy.Field()
然后我们的先分析一下我们要爬取得网站,然后才知道该怎么获取我们需要的数据。
网址:https://movie.douban.com/top250
再编辑爬虫文件之前,先打开setting.py这个文件,把22行的ROBOTSTXT_OBEY = True
改成,表示不遵守robot协议。
ROBOTSTXT_OBEY = False
再把42行到45行的请求头信息的注释给取消掉,并增加自己浏览器的user-agent
DEFAULT_REQUEST_HEADERS = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'en',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36',
}
之后打开spiders目录下的爬虫文件,即first_spider.py文件。把start_urls,改成第一个网页的网址。
start_urls = ['https://movie.douban.com/top250?start=0&filter=']
在parse函数中编写具体的爬取代码。当我们把要获取到的数据解析出来后,再按照item.py的要求整合,并返回给引擎
from douban_top250.items import Douban_top250Item
item = Douban_top250Item(movie_name=movie_name,
movie_director_actors=movie_director_actors,
movie_time_country=movie_time_country,
movie_grade=movie_grade,
comment_number=comment_number,
movie_introduce=movie_introduce)
yield item
但是这样的话我们就只能够爬取一个网址,回忆一下,我们平时想看下一页内容是怎么做到的。没错,就是点击下一页,我们我们可以找到下一页的网址,这样就能够把所有网页爬取到。
next_url = response.xpath('//div[@class="paginator"]/span[@class="next"]/a/@href').get()
if not next_url:
return
else:
next_url = "https://movie.douban.com/top250" + next_url
yield scrapy.Request(next_url, callback=self.parse)
存储内容
我们想把最后的数据存储成表格的形式。
def __init__(self):
self.fp = open("douban.csv", "wb")
self.exporter = CsvItemExporter(self.fp, fields_to_export=['movie_name',
'movie_director_actors',
'movie_time_country',
'movie_grade',
'comment_number',
])
结束之后打开setting.py文件,取消掉68行到70行的注释,这样才能使用pipeline.py文件。
怎么运行爬虫?
有两种方法运行这个爬虫:
1.用cmd,进入这个爬虫项目中,然后输入命令
scrapy crawl douban_spider
2.新建一个爬虫文件,名字随意,写入代码
from scrapy import cmdline
cmdline.execute("scrapy crawl douban_spider".split())
然后运行你新建的这个文件就行了。
结果展示
这个爬虫的所有参考代码我放在我的github上面
https://github.com/yangxulin/douban250