目录
二、Scrapy爬虫基本使用
1、Scrapy爬虫的第一个实例
(1)演示HTML地址
演示HTML页面地址:http://python123.io/ws/demo.html。
文件名称:demo.html。
(2)产生步骤
步骤1:建立一个Scrapy爬虫工程
管理员权限启动cmd。
输入:
scrapy startproject python123demo
生成的工程目录:
python123demo/ middlewares.py | 外层目录 Middlewares代码模板(继承类) |
步骤2:在工程中产生一个Scrapy爬虫
管理员权限启动cmd。
输入:
cd python123demo
scrapy genspider demo python123.io
该命令作用:生成一个名称为demo的spider;在spiders目录下增加代码文件demo.py。
该命令仅用于生成demo.py,该文件也可以手工生成。
demo.py文件:
# -*- coding: utf-8 -*-
import scrapy
class DemoSpider(scrapy.Spider):
name = 'demo'
allowed_domains = ['python123.io']
start_urls = ['http://python123.io/']
def parse(self, response):
pass
# parse()用于处理响应,解析内容形成字典,发现新的URL爬取请求。
步骤3:配置产生的spider爬虫
配置:初始URL地址;获取页面后的解析方式。
# -*- coding: utf-8 -*-
import scrapy
class DemoSpider(scrapy.Spider):
name = 'demo'
# allowed_domains = ['python123.io']
start_urls = ['http://python123.io/ws/demo.html']
def parse(self, response):
fname = response.url.split('/')[-1]
with open(fname, 'wb') as f:
f.write(response.body)
self.log('Saved file %s.' % fname)
# parse()用于处理响应,解析内容形成字典,发现新的URL爬取请求。
步骤4:运行爬虫,获取网页
管理员权限启动cmd。
输入:
scrapy crawl demo
demo爬虫被执行,捕获页面存储在demo.html。
(3)小结
①回顾demo.py代码:
import scrapy
class DemoSpider(scrapy.Spider):
name = 'demo'
start_urls = ['http://python123.io/ws/demo.html']
def parse(self, response):
fname = response.url.split('/')[-1]
with open(fname, 'wb') as f:
f.write(response.body)
self.log('Saved file %s.' % fname)
②demo.py代码的完整版本:
# demo.py代码的完整版本
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.' % fname)
③demo.py两个等价版本的区别:
yield scrapy.Request(url=url, callback=self.parse)
2、yield关键字的使用
(1)yield关键字
yield↔生成器。
生成器是一个不断产生值的函数。
包含yield语句的函数是一个生成器。
生成器每一次产生一个值(yield语句),函数被冻结,被唤醒后再产生一个值。
(2)实例
①生成器写法:
# 生成器写法
def gen(n):
for i in range(n):
yield i ** 2
for i in gen(5):
print(i, " ", end="")
②普通写法:
# 普通写法
def square(n):
ls = [i ** 2 for i in range(n)]
return ls
for i in square(5):
print(i, " ", end="")
(3)为何要有生成器?
生成器相比一次列出所有内容的优势:更节省存储空间;响应更加迅速;使用更灵活。
如果n=1M、10M、100M或更大呢?
# 为何要有生成器?
def square(n):
ls = [i ** 2 for i in range(n)]
return ls
def gen(n):
for i in range(n):
yield i ** 2
3、Scrapy爬虫的基本使用
(1)Scrapy爬虫的使用步骤
步骤1:创建一个工程和Spider模板。
步骤2:编写Spider。
步骤3:编写Item Pipeline。
步骤4:优化配置策略。
(2)Scrapy爬虫的数据类型
Request类;Response类;Item类。
①Request类:
class scrapy.http.Request()。
Request对象表示一个HTTP请求;由Spider生成,由Downloader执行。
属性或方法 | 说明 |
.url | Request对应的请求URL地址 |
.method | 对应的请求方法,‘GET’ ‘POST’等 |
.headers | 字典类型风格的请求头 |
.body | 请求内容主体,字符串类型 |
.meta | 用户添加的扩展信息,在Scrapy内部模块间传递信息使用 |
.copy() | 复制该请求 |
②Response类:
class scrapy.http.Response()。
Response对象表示一个HTTP响应;由Downloader生成,由Spider处理。
属性或方法 | 说明 |
.url | Response对应的URL地址 |
.status | HTTP状态码,默认是200 |
.headers | Response对应的头部信息 |
.body | Response对应的内容信息,字符串类型 |
.flags | 一组标记 |
.request | 产生Response类型对应的Requests对象 |
.copy() | 复制该响应 |
③Item类:
class scrapy.item.Item()。
Item对象表示一个从HTML页面中提取的信息内容;由Spider生成,由Item Pipeline处理;Item类似字典类型,可以按照字典类型操作。
(3)Scrapy爬虫提取信息的方法
Scrapy爬虫支持多种HTML信息提取方法。
①Beautiful Soup。
②lxml。
③re。
④XPath Selector。
⑤CSS Selector。
(4)CSS Selector的基本使用
使用格式:
<HTML>.css('a::attr(href)').extract()
①a:标签名称。
②href:标签属性。
CSS Selector由W3C组织维护并规范。