Scrapy不是一个函数功能库,而是一个爬虫框架。
5+2模块。构成scrapy框架。
3条主要数据流路径:
SPIDERS --(获得爬取请求,request,一个url)–> ENGINE --> SCHEDULER(负责对爬取请求进行调度)
SCHEDULE --(获得下一个爬取的网络请求)–> ENGINE --(通过中间键发送给下一个模块)–> DOWNLOADER(链接互联网,爬取相关网页,爬取的内容形成response对象)–(中间键)–>ENGINE --(中间键)–>SPIDERS
SPIDER (处理从DOWNLOADER获得的相应,产生两个数据类型,一个是ITEM,一个是REQUEST(新的爬取请求,下次爬取))–> ENGINE --(将ITEM发给前者,REQUEST给后者)–> ITEM PIPELINES & SCHEDULER
ENGINE SCHEDULER DOWNLOADER 都是无需人工操作,是已有的功能的模块。用户只需编写SPIDERS(url链接和解析网页内容)ITEM PIPELINES(提取的信息处理)
ENGINE 所有模块的核心,控制所有模块之间的数据流。根据条件触发事件。
DOWNLOADER 根据请求下载网页。
SCHEDULER 对所有爬取请求进行调度管理。
中间键(Downloader Middleware ):实施Engine、Scheduler、Downloader之间进行用户可配置的控制。可以修改、丢弃、新增请求或相应
SPIDER: 解析Downloader返回的相应(response),提供最初始的url。对每次爬取的内容进行解析,产生新的爬取请求,并从内容中提取相关数据。
ITEM PIPELINES:流水线方式处理,产生对网页爬取后的信息。
中间键(Spider Middleware):对请求和爬取项的再处理。修改、丢弃、新增请求或爬取项。
命令行:scrapy
主要在
里实现。
命令 | 说明 | 格式 |
---|---|---|
startproject | 创建一个新工程 | scrapy startproject |
genspider | 创建一个爬虫 | scrapy genspider [options] |
settings | 获得爬虫配置信息 | scrapy settings [options] |
crawl | 运行一个爬虫 | scrapy crawl |
list | 列出工程中所有爬虫 | scrapy list |
shell | 启动URL调试命令行 | scrapy shell [url] |
爬虫步骤:
1. 建立爬虫框架
scrapy startproject python123demo
会产生一个python123demo/的外层目录。
2. 生成scrapy爬虫:
执行命令–>给出爬虫名字,爬取网站。
利用genspider生成爬虫:
cd python123demo
scrapy genspider demo python123.io
在spiders目录下增加了一个demo.py(也可以不用命令生成,手动也可以。)
demo.py文件中的内容如下:(注释部分自己加的)
# -*- coding: utf-8 -*-
import scrapy
class DemoSpider(scrapy.Spider): #面向对象编写的一个类,叫DemoSpider。这个类必须是继承scrapy.Spider的子类。
name = 'demo' #当前爬虫名字叫demo
allowed_domains = ['python123.io'] #刚开始提交的域名。只能爬取这个域名以下的相关链接。
start_urls = ['http://python123.io/'] #以列表包含的一个或多个url是爬虫要爬取的初始页面。
def parse(self, response): #解析页面的空的方法。
pass #parse()用于处理相应,解析内容形成字典,发现新的url爬取请求。
3. 配置产生的spider爬虫。
并没有听懂这段的内容,,代码不知道啥意思。python下面的东西还没学通,先把代码copy下来以后慢慢理解。
import scrapy
class DemoSpider(scrapy.Spider): #面向对象编写的一个类,叫DemoSpider。这个类必须是继承scrapy.Spider的子类。
name = 'demo' #当前爬虫名字叫demo
#allowed_domains = ['python123.io'] #刚开始提交的域名。只能爬取这个域名以下的相关链接。
start_urls = ['http://python123.io/ws/demo.html'] #以列表包含的一个或多个url是爬虫要爬取的初始页面。
def parse(self, response): #解析页面的空的方法。
fname = response.url.split('/')[-1] #parse()用于处理相应,解析内容形成字典,发现新的url爬取请求。
with open(fname,'wb') as f:
f.write(response.body)
self.log('Saved file %s.'% name)
4. 运行爬虫。
在命令行中输入scrapy crawl demo
即可运行。
文件被存储在demo/文件中。
上面配置产生爬虫的代码为简化代码。完整代码中用到了yield关键字。
yield – 生成器:不断产生值的函数。生成器每次产生一个值,然后函数被冻结,直到被唤醒后再产生一个值。
生成器的使用一般与循环搭配一起。
def gen(n):
for i in range(n):
yield i**2
for i in gen(5): #每次for都会把gen唤醒一次。
print(i,' ', end = '')
0 1 4 9 16
生成器写法的好处:
点击这里又更详细描述。(别人的博客。)
完整写法:
import scrapy
class DemoSpider(scrapy.Spider):
name = 'demo'
def start_requests(self):
urls = ['http://python123.io/ws/demo.html']
for url in urls:
yield scrapy.Request(url = url, callback = self.parse)
def parse(self, response):
fname = response.url.split('/')[-1]
with open(fname,'wb') as f:
f.write(response.body)
self.log('Saved file %s.'% name)
基本使用:
涉及 Request类,Response类,Item类。
Request类: Request对象表示一个HTTP请求。由spider生成,由downloader执行。具体属性或方法:
属性或方法 | 说明 |
---|---|
.url | Request对应的请求URL地址 |
.method | 对应的请求方法,‘GET’ ‘POST’ 等 |
.headers | 字典类型风格的请求头 |
.body | 请求内容主题,字符串类型 |
.meta | 用户添加的扩展信息,在Scrapy内部模块间传递信息使用 |
.copy() | 复制该请求 |
Response类: Response对象表示一个HTTP相应。由Downloader生成由Spider处理。具体属性或方法:
属性或方法 | 说明 |
---|---|
.url | Response对应的url地址 |
.status | HTTP状态码,默认是200 |
.headers | Response对应的头部信息 |
.body | Response对应的内容信息,字符串类型 |
.flags | 一组标记 |
.request | 产生Response类型对应的Request对象 |
.copy() | 复制该相应 |
Item类: Item对象表示一个从HTML页面中提取的信息内容。由Spider生成,Item Pipline处理。Item类似字典类型,可以按照字典类型操作。
CSS Selector 的基本使用:
<HTML>.css('a::attr(href)').extract()
a 是标签名称。 href是标签属性。
感觉学了这么多这节没学进去啥。。基础太弱。还要继续。。自学完pythoncrash后再回头看看。。。