scrapy架构
- Engine 引擎,处理整个系统的数据流处理、触发事务,是整个框架的核心
- Item 项目,它定义了爬取结果的数据结构,爬取的数据会被赋值成该Item 对象
- Scheduler 调度器,接受引擎发过来的请求,并将其列中在引擎再次请求的时候将请求提供给引擎
- Downloader 下载器,下载网页内容,并将网页内容返回给spider
- Spiders 爬虫,其内定义了爬取的逻辑和网页解析规则,它主要负责解析响应并生成提取结果和新的请求
- Item Pipeline 项目管道,负责处理由spider从网页中抽取的项目,它的主要任务是清洗、验证和存储数据
- Downloader Middlewares 下载器中间件,位于引擎和下载器之间的钩子框架,主要处理引擎与下载器之间的请求及响应
- Spide Middlewares 爬虫中间件,位于引擎和爬虫之间的钩子框架,主要处理爬虫输入的响应和输出的结果及新的请求
命令
- 创建项目
scrapy startproject 项目名称 - 创建一个spider
scrapy genspider 爬虫名称 项目域名
在创建一个spider时,后面跟的是参数域名
,不要多写其它 - 启动爬虫
scrapy.spiders.Spider 类的基础属性和方法
属性
- name:爬虫名称,
- allowed_domain:允许爬取的域名,是可选配置,不在此域名下的链接,不会被跟进爬取
- start_urls:起始url列表,当spider开始时,如果没有实现start_requests()方法,默认会从该列表开始抓取
- crawler:它是由 from_crawler()方法设置的,代表的是本 pider 类对应的 crawler 对象Crawler对象包含了很多项目组件,利用它我们可以获取项目的一些配置信息,如最常见的获取项目的设置信息,即 Setting
- custom_settings:是一个字典,专属于本 spider 的配置。它会覆盖项目全局的设置。此设置必须在初始化前被更新,必须定义成类变量
- settings:可以通过该属性获取setting文件中的全局变量
方法
- start_requests:该方法用于生成初始请求,返回一个可迭代对象。该方法默认使用start_urls列表中的url构造request,默认request是get请求方式,如果我们想在启动时以 POST 方式访问某个站点,可以直接重写这个方法,发送 POST 请求时使用
FormRequest
。
即可 - parse:当 没有指定回调函数时,该方法会默认被调用。对response进行处理,解析出新的url或数据。
- closed:当spider关闭时,该方法会被调用。在这里一般会定义释放资源的一些操作或其他收尾操作。
Downloader Middleware
通常在下载中间件进行,修改UserAgent,设置Proxy,处理重定向,失败重试,设置Cookies等操作。
-
process_request(request,spider)
Request Scrapy 引擎调度给 Downloader 之前, process_request ()方法就会被调用,也就是在Request 从队列里调度出来到 Down loader 下载执行之前,我们都可以用 process_request ()方法对Request 进行处。方法的返回值必须为 None、Response对象、request对象之一 ,或者抛出 IgnoreRequest 。- 当返回None时,
-
process_response(request,response,spider)
-
process_exception(request,exception,spider)
常用示例代码
- selector的独立使用
from scrapy import Selector
body = '<html>......</html>'
selector = Selector(text=body)
title = selector.xpath('//title/text()').extract_first()
- pipeline存储mongo
import pymongo
class MongoPipeline(object):
def __init__(self,mongo_url,mongo_db):
self.mongo_url = mongo_url
self.mongo_db = mongo_db
# 从settings获取变量
@classmethod
def from_crawler(cls,crawler):
return cls(
crawler.settings.get('MONGO_URL'),
crawler.settings.get('MONGO_DB')
)
def open_spider(self,spider):
self.client = pymongo.MongoClient(self.mongo_url)
self.db = self.client[self.mongo_db]
def process_item(self,item,spider):
name = item.class.name
self.db[name].insert(dict(item))
return item
def close_spider(self,spider):
self.client.close()
- 修改user-agent
有两种方法可以修改请求时的user-agent。
一是修改settings中的USER-AGENT变量
二是通过downloader middleware的process-request方法修改
参考书籍:
《python3网络爬虫开发实战》【崔庆才】·1
网友评论