目录
- 参考
- 概述
- 安装
- 编写scrapy程序
- 问题总结
1. 参考
- [1] docs.scrapy.org/en/latest/intro/tutorial
- [2] docs.scrapy.org/en/latest/intro/install
- [3] rwxwsblog/如何让你的scrapy爬虫不再被ban
- [4] 生无可恋的程序员/Python--Scrapy爬虫获取简书作者ID的全部文章列表数据
- [5] liuhehe123/scrapy--解决css选择器遇见含空格类提取问题response.css()
- [6] yamadeee/Scrapy Selector选择器
- [7] stackoverflow/scraping the file with html saved in local system
- [8] runoob/Scrapy 入门教程
2. 概述
Scrapy 是用 Python 实现的一个为了爬取网站数据、提取结构性数据而编写的应用框架。
Scrapy架构图(绿线是数据流向)
- Scrapy Engine(引擎): 负责Spider、ItemPipeline、Downloader、Scheduler中间的通讯,信号、数据传递等。
- Scheduler(调度器): 负责接受引擎发送过来的Request请求,并按照一定的方式进行整理排列,入队,当引擎需要时,交还给引擎。
- Downloader(下载器):负责下载Scrapy Engine(引擎)发送的所有Requests请求,并将其获取到的Responses交还给Scrapy Engine(引擎),由引擎交给Spider来处理,
- Spider(爬虫):负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器)。
- Item Pipeline(管道):负责处理Spider中获取到的Item,并进行进行后期处理(详细分析、过滤、存储等)的地方。
- Downloader Middlewares(下载中间件):可以当作是一个可以自定义扩展下载功能的组件。
- Spider Middlewares(Spider中间件):可以理解为是一个可以自定扩展和操作引擎和Spider中间通信的功能组件(比如进入Spider的Responses;和从Spider出去的Requests)
3. 安装
安装依赖
apt-get install python-dev python-pip libxml2-dev libxslt1-dev zlib1g-dev libffi-dev libssl-dev
安装scrapy
pip3 install Scrapy
4. 编写scrapy程序
创建scrapy工程
scrapy startproject project_name
project_name/
scrapy.cfg # deploy configuration file
tutorial/ # project's Python module, you'll import your code from here
__init__.py
items.py # project items definition file
middlewares.py # project middlewares file
pipelines.py # project pipelines file
settings.py # project settings file
spiders/ # a directory where you'll later put your spiders
__init__.py
文件说明:
- scrapy.cfg:项目的配置信息,主要为Scrapy命令行工具提供一个基础的配置信息。(真正爬虫相关的配置信息在settings.py文件中)
- items.py:设置数据存储模板,用于结构化数据,如:Django的Model
- pipelines:数据处理行为,如:一般结构化的数据持久化
- settings.py:配置文件,如:递归的层数、并发数,延迟下载等
- spiders:爬虫目录,如:创建文件,编写爬虫规则
示例程序,放在spiders目录
import scrapy
class QuotesSpider(scrapy.Spider):
name = "quotes"
def start_requests(self):
urls = [
'http://quotes.toscrape.com/page/1/',
'http://quotes.toscrape.com/page/2/',
]
for url in urls:
yield scrapy.Request(url=url, callback=self.parse)
def parse(self, response):
page = response.url.split("/")[-2]
filename = 'quotes-%s.html' % page
with open(filename, 'wb') as f:
f.write(response.body)
self.log('Saved file %s' % filename)
QuotesSpider继承于scrapy.Spider,并定义了一些属性和方法:
- name: 标识这个Spider。它在项目中必须是唯一的,也就是说,不能为不同的Spiders设置相同的名称。
- start_requests():必须返回一个可迭代的请求(可以返回一个请求列表或编写一个生成器函数),Spiders将开始从中爬行。后续请求将从这些初始请求中依次生成。
- parse():它将被调用来处理为每个请求下载的响应。response参数是TextResponse的一个实例,它包含页面内容,并且有进一步有用的方法来处理它。parse()方法通常解析响应,将抓取的数据提取为dict,并找到要跟踪的新url,并从中创建新的请求(请求)。
运行scrapy
scrapy crawl quotes
- 这个命令使用刚刚添加的名称为quotes的运行Spider,它将发送对quotes.toscrape.com域名的一些请求。会得到一个类似的输出:
(omitted for brevity)
2016-12-16 21:24:05 [scrapy.core.engine] INFO: Spider opened
2016-12-16 21:24:05 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2016-12-16 21:24:05 [scrapy.extensions.telnet] DEBUG: Telnet console listening on 127.0.0.1:6023
2016-12-16 21:24:05 [scrapy.core.engine] DEBUG: Crawled (404) <GET http://quotes.toscrape.com/robots.txt> (referer: None)
2016-12-16 21:24:05 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://quotes.toscrape.com/page/1/> (referer: None)
2016-12-16 21:24:05 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://quotes.toscrape.com/page/2/> (referer: None)
2016-12-16 21:24:05 [quotes] DEBUG: Saved file quotes-1.html
2016-12-16 21:24:05 [quotes] DEBUG: Saved file quotes-2.html
2016-12-16 21:24:05 [scrapy.core.engine] INFO: Closing spider (finished)`
检查当前目录中的文件。应该已经创建了两个新文件:quotes-1.html和quotes-2.html,以及对应url的内容,正如我们的解析方法所指示的那样。
可以使用Feed导出结果,使用以下命令输出为json格式数据:
scrapy crawl quotes -o quotes.json
5. 问题总结
5.1 HTTP 403
解决方法:
在Settings.py中增加UA的设置,伪装为浏览器的访问
USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36'
5.2 class名称中有空格
参考[5],空格用“.”替代空格
5.3 怎么解析本地文件
url使用file的地址符,如下所示:
file:///path_of_directory/example.html