1 Scrapy爬虫的第一个实例
- 产生步骤(1)
应用 Scrapy 爬虫框架主要是编写配置型代码
步骤1∶建立一个 Scrapy 爬虫工程
选取一个目录(D:\pycodes),然后执行如下命令∶
以 firstdemo 项目的文件目录为例:
- 产生步骤(2)
步骤2∶在工程中产生一个 Scrapy 爬虫
进入工程目录(D:\pycodes\python123demo),然后执行如下命令∶
该命令作用︰
(1) 生成一个名称为 demo 的 spider
(2) 在 spiders 目录下增加代码文件 demo.py
该命令仅用于生成 demo.py,该文件也可以手工生成
- 产生步骤(3)
步骤3∶配置产生的 spider 爬虫
配置∶(1) 初始URL地址 (2) 获取页面后的解析方式
# -*- coding: ut-8-*-
# 简化版
import scrapy
class DemoSpider(scrapy.Spider):
name = "demo" # 爬虫文件的名称:就是爬虫源文件的—个唯一标识
# allowed_domains = ["python123.io"] 允许的域名:用来限定start_urls列表中哪些url可以进行请求发送
start_uris = ['http:i/python123.io/ws/demo.htm1'] # 起始的url列表:该列表中存放的url会被scrapy自动进行请求的发送
# 用作于数据解析:response参数表示的就是请求成功后对应的响应对象
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)
# 完整版
import scrapy
class Demospider(scrapy.Spider):
name = "demo"
def start_requests(self):
urls = ['http:/lpython123.io/ws /demo .html']
for url in urls:
yield scrapy.Request(url=ur1, 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)
- 产生步骤(4)
步骤4∶运行爬虫,获取网页
在命令行下,执行如下命令∶
demo 爬虫被执行,捕获页面存储在 demo.html
2 yield 关键字的使用
[带有 yield 的函数在 Python 中被称之为 generator (生成器)]
生成器每调用一次在 yield 位置产生一个值,直到函数执行结束
生成器相比一次列出所有内容的优势:
a) 更节省存储空间 b) 响应更迅速 c) 使用更灵活
生成器的引入
如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。
在 Python 中,这种一边循环一边计算的机制,称为生成器(generator)。
1) 要创建一个 generator,有很多种方法。第一种方法很简单,只要把一个列表生成式的 [] 改成 (),就创建了一个 generator
怎么打印出 generator 的每一个元素呢?
想要一个一个打印出来,可以通过 next() 函数获得 generator 的下一个返回值:
generator 保存的是算法,每次调用 next(g),就计算出 g 的下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出 StopIteration 的错误。
generator 也是可迭代对象,我们可以利用 for 循环遍历提取其中的元素。
2) 定义 generator 的另一种方法,yield 关键字
如果一个函数定义中包含 yield 关键字,那么这个函数就不再是一个普通函数,而是一个 generator
generator 和函数的执行流程不一样。函数是顺序执行,遇到 return 语句或者最后一行函数语句就返回。而变成 generator 的函数,在每次调用 next() 的时候执行,遇到 yield 语句返回,再次执行时从上次返回的 yield 语句处继续执行。
可以看到,odd 不是普通函数,而是 generator,在执行过程中,遇到 yield 就中断,return 出要生成的数,下次又继续执行。
3 Scrapy 爬虫的基本使用
Scrapy 爬虫的数据类型
CSS Selector 的基本使用:
CSS Selector (CSS选择器)由 W3C 组织维护并规范
4 Scrapy 拓展
由于执行项目会默认打印日志,对于我们要查看的显示信息进行干扰,我们可以选择不打印日志。
--> scrapy crawl first --nolog
但这种方式会不打印所有日志,代码出现错误时不会显示结果,也不会有错误提示。因此,可以考虑只打印错误日志,其余日志不打印。
修改配置后,只会打印错误日志,无错误时不打印日志