Scrapy 基础
一个简单爬虫
Scrapy是Python中为了爬去网页数据而提供的框架,主要应用于:数据挖掘,信息处理或存储历史数据等一系列的程序中。那么我们爬数据的的本质是什么呢?就是利用Http、Https协议将开放性的web内容下载到本地中。 当然既然有爬虫就会有所谓的反爬,反反爬,反反爬。。。各种防范措施,但是程序员是不会放弃的。
Scrapy是什么?
-
1.Scrapy是蜘蛛爬虫框架,我们用蜘蛛来获取互联网上的各种信息,然后再对这些信息进行数据分析处理。
-
2.Scrapy的组成
- 引擎:处理整个系统的数据流处理,出发事务
- 调度器: 接受引擎发过来的请求,压入队列中,并在引擎再次请求的时候返回
- 下载器: 下载网页内容,并将网页内容返回给蜘蛛
- 蜘蛛: 蜘蛛是主要干活的,用来制定特定域名或网页的解析规则
- 项目管道: 清洗验证存储数据,页面被蜘蛛解析后,被发送到项目管道,并经过几个特定的次序处理数据。
- 下载器中间件: 位于引擎和下载器之间,处理引擎与下载器之间的请求及响应
- 蜘蛛中间件:位于引擎和蜘蛛之间,处理从引擎发送到调度的请求及响应

-
3.工作机制
- 爬取流程
- 首先从URL开始,Scheduler会将其交给Downloader进行下载,下载之后会交给Spider进行分析,Spider分析出来的结果有两种:一种是需要进一步抓取的链接,例如之前分析的“下一页”的链接,这些东西会被传回给Scheduler;另一种是需要保存的数据,他们被送到Item Pipeline那里,那是对数据进行后期处理(详细分析,过滤,存储)的地方。另外在数据流动的管道里还可以安装各种中间件,进行必要的处理。
- 数据流程
- 1.引擎打开一个网站,找到处理该网站的Spider,并向Spider请求第一个要爬取的URL。
- 2.引擎从Spider中获取到第一个要爬取的URL并在调度器中以request进行调度。
- 3.引擎向调度器请求下一个要爬取的URL
- 4.调度器返回下一个要爬取的URL给引擎,引擎将URL通过下载中间件转发给下载器
- 5.下载完毕后,下载器生成一个该页面的response,并将其通过中间件返回给引擎
- 6.引擎从下载器中接收到response并通过Spider中间件发送给Spider处理
- 7.Spider处理response并返回爬取到的Item及新的Request给引擎。
- 8.引擎将爬取到的Item给Item Pipeline,将Request给调度器
- 9.从第二步重复,直到调度器中没有更多的request,引擎关闭该网站。
- 爬取流程
爬取豆瓣电影
新建Scrapy项目
scrapy startproject douban
新建spider文件
scrapy genspider douban_spider movie.douban.com
Scrapy 抓取四步走
- 新建项目
- 明确目标
- 制作爬虫
- 存储内容
明确目标
item.py 文件
# 序号
serial_number = scrapy.Field()
# 电影的名称
movie_name = scrapy.Field()
# 电影的介绍
introduce = scrapy.Field()
# 星级
star = scrapy.Field()
# 电影的评论数
evaluate = scrapy.Field()
# 电影的描述
describe = scrapy.Field()
爬虫文件(spider)的编写
douban_spider.py
我们的引擎会向我们的spider要一个入口url。之后,我们的引擎会将入口url扔到调度器里面。我们调度器拿到入口url进行调度之后,调度器又会把这个url扔给我们的引擎。高大上的引擎不会干这活,它又把url扔给我们的下载器,扔给下载器之后进行数据的解析和下载。下载完之后会返回到我们的spider文件里面来,然后parse方法进行解析。
# 爬虫名,和项目名称不能重复
name = 'douban_spider'
# 要抓取的域名
allowed_domains = ['movie.douban.com']
# 入口url
# start_urls = ['http://movie.douban.com/']
start_urls = ['https://movie.douban.com/top250']
def parse(self, response):
print(response.text)
运行项目 scrapy crawl douban_spider
此时会报错 DEBUG: Crawled (403)
此时要设置User-Agent
setting.py
#USER_AGENT = 'douban (+http://www.yourdomain.com)' 要修改
设置一个启动文件
main.py
# 先导入一个包
from scrapy import cmdline
# 在cmdline里面,去执行一些命令
cmdline.execute("scrapy crawl douban_spider".split()) # 进行一个字符串的处理
编写我们的解析文件
在这里面如何进行解析呢?我们主要用到的技术就是xpath,通过xpath,来解析我们目标页面里面的HTML节点。
douban_spider 文件 解析代码
movie_list = response.xpath("//div[@class='article']//ol[@class='grid_view']/li")
for i_item in movie_list:
print(i_item)
进一步的解析
# 引入我们之前定义好的item
from douban.items import DoubanItem