一、scrapy定义
scrapy是一个高性能的、异步的、分布式的爬虫框架。scrapy是基于Twisted的异步来进行处理异步请求的。
架构图如下:
各组件功能:
- scrapy Engine:引擎,整个框架的核心,用于整个系统的数据流处理,触发事物
- schedule:调度器,用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个URL(抓取网页的网址或者说是链接)的优先队列, 由它来决定下一个要抓取的网址是什么, 同时去除重复的网址
- Downloader:下载器,用于下载网页内容, 并将网页内容返回给蜘蛛(Scrapy下载器是建立在twisted这个高效的异步模型上的)
- Spiders:爬虫,爬虫是主要干活的, 用于从特定的网页中提取自己需要的信息, 即所谓的实体(Item)。用户也可以从中提取出链接,让Scrapy继续抓取下一个页面
- Pipeline:项目管道,负责处理爬虫从网页中抽取的实体,主要的功能是持久化实体、验证实体的有效性、清除不需要的信息。当页面被爬虫解析后,将被发送到项目管道,并经过几个特定的次序处理数据。
- Downloader Middlewares:下载器中间件,位于Scrapy引擎和下载器之间的框架,主要是处理Scrapy引擎与下载器之间的请求及响应。
- Spider Middlewares:爬虫中间件,介于Scrapy引擎和爬虫之间的框架,主要工作是处理蜘蛛的响应输入和请求输出。
- Scheduler Middewares:调度中间件,介于Scrapy引擎和调度之间的中间件,从Scrapy引擎发送到调度的请求和响应。
二、windows下安装scrapy
1、安装Twisted
a、pip3 install wheel
b、下载twisted,https://www.lfd.uci.edu/~gohlke/pythonlibs/
c、pip3 install Twisted-xxx.whl
2、安装scrapy
pip3 install scrapy
三、scrapy使用:
1、创建项目:
命令行运行命令:
scrapy startproject your_project_name
它会自动创建一下目录:
project_name
/
scrapy.cfg
project_name
/
__init__.py
items.py
pipelines.py
settings.py
spiders
/
__init__.py
爬虫
1.py
爬虫2.py
爬虫
3.py
文件说明:
- scrapy.cfg 项目的配置信息,主要为Scrapy命令行工具提供一个基础的配置信息。(真正爬虫相关的配置信息在settings.py文件中)
- items.py 设置数据存储模板,用于结构化数据,如:Django的Model
- pipelines 数据处理行为,如:一般结构化的数据持久化
- settings.py 配置文件,如:递归的层数、并发数,延迟下载等
- spiders 爬虫目录,如:创建文件,编写爬虫规则
注意:一般创建爬虫文件时,以网站域名命名
示例、
import scrapy
from scrapy.selector import HtmlXPathSelector
from scrapy.http.request import Request
class DigSpider(scrapy.Spider):
# 爬虫应用的名称,通过此名称启动爬虫命令,不过一般我们会把名字命名为跟域名一样
name = "dig"
# 允许的域名
allowed_domains = ["chouti.com"]
# 起始URL
start_urls = [
'http://dig.chouti.com/',
]
has_request_set = {}
# 访问起始URL并获取结果后的回调函数
def parse(self, response):
print(response.url)
hxs = HtmlXPathSelector(response)
page_list = hxs.select('//div[@id="dig_lcpage"]//a[re:test(@href, "/all/hot/recent/\d+")]/@href').extract()
for page in page_list:
page_url = 'http://dig.chouti.com%s' % page
key = self.md5(page_url)
if key in self.has_request_set:
pass
else:
self.has_request_set[key] = page_url
obj = Request(url=page_url, method='GET', callback=self.parse)
yield obj # 它会对接下来的url循环往复的去爬取
@staticmethod
def md5(val):
import hashlib
ha = hashlib.md5()
ha.update(bytes(val, encoding='utf-8'))
key = ha.hexdigest()
return key
执行此爬虫文件,则在终端进入项目目录执行如下命令:
scrapy crawl dig --nolog
对于上述代码重要之处在于:
Request是一个封装用户请求的类,在回调函数中yield该对象表示继续访问
HtmlXpathSelector用于结构化HTML代码并提供选择器功能
scrapy其他命令:
Available commands:
bench Run quick benchmark test
check Check spider contracts
crawl Run a spider
edit Edit spider
fetch Fetch a URL using the Scrapy downloader
genspider Generate new spider using pre-defined templates
list List available spiders
parse Parse URL (using its spider) and print the results
runspider Run a self-contained spider (without creating a project)
settings Get settings values
shell Interactive scraping console
startproject Create new project
version Print Scrapy version
view Open URL in browser, as seen by Scrapy