一、Scrapy是什么?
Scrapy是Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。
二、Scrapy五大基本构成
Scrapy框架主要由五大组件组成,它们分别是调度器(Scheduler)、下载器(Downloader)、爬虫(Spider)和实体管道(Item Pipeline)、Scrapy引擎(Scrapy Engine)。下面我们分别介绍各个组件的作用。
(1)、调度器(Scheduler):
调度器,说白了把它假设成为一个URL(抓取网页的网址或者说是链接)的优先队列,由它来决定下一个要抓取的网址是什么,同时去除重复的网址(不做无用功)。用户可以自己的需求定制调度器。
(2)、下载器(Downloader):
下载器,是所有组件中负担最大的,它用于高速地下载网络上的资源。Scrapy的下载器代码不会太复杂,但效率高,主要的原因是Scrapy下载器是建立在twisted这个高效的异步模型上的(其实整个框架都在建立在这个模型上的)。
(3)、 爬虫(Spider):
爬虫,是用户最关心的部份。用户定制自己的爬虫(通过定制正则表达式等语法),用于从特定的网页中提取自己需要的信息,即所谓的实体(Item)。 用户也可以从中提取出链接,让Scrapy继续抓取下一个页面。
(4)、 实体管道(Item Pipeline):
实体管道,用于处理爬虫(spider)提取的实体。主要的功能是持久化实体、验证实体的有效性、清除不需要的信息。
(5)、Scrapy引擎(Scrapy Engine):
Scrapy引擎是整个框架的核心.它用来控制调试器、下载器、爬虫。实际上,引擎相当于计算机的CPU,它控制着整个流程。
三、整体架构图
四、安装步骤
1.下载并安装
pip install scrapy
2.项目建立&爬虫命令
scrapy startproject 项目名
scrapy genspider 爬虫名 域名
scrapy crawl 爬虫名
示例演示:
scrapy startproject scrapy2209
cd scrapy2209
scrapy genspider baidu www.baidu.com
创建后目录大致页如下
|-ProjectName #项目文件夹
|-ProjectName #项目目录
|-items.py #定义数据结构
|-middlewares.py #中间件
|-pipelines.py #数据处理
|-settings.py #全局配置
|-spiders
|-_ init _.py #爬虫文件
|-baidu.py
|-scrapy.cfg #项目基本配置文件
import scrapy
class BaiduSpider(scrapy.Spider):
name = 'baidu'
allowed_domains = ['www.baidu.com']
start_urls = ['http://www.baidu.com/']
def parse(self, response):
tile=response.xpath('//html/head/title/text()')
print(tile)
打开一个终端cmd,输入scrapy crawl baidu(爬虫名),就可以看到一大堆输出信息,而其中就包括我们要的内容
有时候会出现403错误:
[scrapy.spidermiddlewares.httperror] INFO: Ignoring response <403 beijing.8684.cn/x_35b1e697>: HTTP status code is not handled or not allowed
那是因为——被屏蔽了,我们来伪装一下,在settings.py文件里加上USER_AGENT:
出来了!!
3.scrapy在Pycharm中的使用
①开启终端命令行窗口
②输入scrapy crawl 爬虫名
出现相应的内容
图中示例:
用scrapy进行多级网页爬取
import scrapy
class Db35Spider(scrapy.Spider):
name = 'db35'
allowed_domains = ['movie.douban.com']
start_urls = ['http://movie.douban.com/top250']
# 从豆瓣电影排行榜页面,爬取所有的电影名称、电影评分、剧情简介 并且在控制台输出
# 分析: 通过浏览器访问网页可以发现: 所有需要的爬取信息都可以在每部电影的详情页中获取
def parse(self, response):
# 1.从当前页面解析出所有的25部电影的详情页
detail_pages = response.css('div.hd a::attr(href)').extract()
# response.xpath('//div[@class="hd"]/a/@href').extract()
print(detail_pages)
# 2.依次将电影的详情页的url传给下载器下载,并且指定由新的方法解析
for i in detail_pages:
yield scrapy.Request(i, callback=self.parse_detail)
# 3 获取下一个电影排榜页面的url并且拼接完整
# 提取下页的url后缀
tail_url = response.css('span.next a::attr(href)').extract()
# 将下页的URL拼接完整
pre_url = 'http://movie.douban.com/top250'
next_url = pre_url + tail_url[0]
print(next_url)
# 如果当前页面存在下页的url后缀标签值,那么则将next_url返回给scrapy引擎,最后继续通过下载器请求网页,然后下载器将下一页的源码再传给spiders解析
if tail_url:
yield scrapy.Request(next_url)
# 构造一个名称为parse_detail的新方法 专门用来解析电影的详情页
def parse_detail(self, response):
# 1、在详情页中解析出电影名称
movie_title = response.xpath('//span[@property="v:itemreviewed"]//text()').extract()
# 2、解析出电影评分
movie_score = response.xpath('//strong[@class="ll rating_num"]//text()').extract()
# 3、解析出电影剧情简介,由于此处contents是字符串列表,其中含有大量的空格等
# contents = response.xpath('//span[@property="v:summary"]//text()').extract()
contents = response.css('span[property="v:summary"]::text').extract()
# 以下两行的作用 遍历contents中的所有字符串 然后使用srtip方法去除空格,然后生成新的列表
contents = [content.strip() for content in contents]
# 将列表中的所有的去掉空格后的字符串拼接成一个字符串元素
content = "".join(contents)
print(movie_title)
print(movie_score)
print(content)
五、日志等级与日志保存
在setting.py里面可以设置日志的等级与日志存放的路径
相关变量
LOG_LEVEL= ""
LOG_FILE="日志名.log"
日志等级分为
1.DEBUG 调试信息
2.INFO 一般信息
3.WARNING 警告
4.ERROR 普通错误
5.CRITICAL 严重错误
如果设置
LOG_LEVEL="WARNING",就只会WARNING等级之下的ERROR和CRITICAL
默认等级是1
六、导出为json或csv格式
执行爬虫文件时添加-o选项即可
scrapy crawl 项目名 -o *.csv
scrapy crawl 项目名 -o *.json
对于json文件,在setting.js文件里添加,设置编码格式,否则会乱码:
FEED_EXPORT_ENCODING='utf-8'
示例:
from scrapy import cmdline
cmdline.execute('scrapy crawl baidu -o baidu.csv'.split())
七、参考文献
python scrapy 报错 DEBUG: Ignoring response 403 - 时光不改 - 博客园 (cnblogs.com) Scrapy爬虫框架,入门案例(非常详细)_JJH的创世纪-DevPress官方社区 (csdn.net)