文章目录
Python爬虫(十二)——scrapy使用
步骤
创建一个scrapy工程
到你要建立的目录下面,打开命令行,输入以下代码:
scrapy startproject demo
将会产生如图的文件:
其中包含一下文件
- scrapy.cfg 部署Scrapy爬虫的配置文件
- demo 用户自定义Python代码
- _init_.py 初始化脚本
- items.py Items代码模板
- middlewares.py Middlewares代码模板
- pipeline.py Pipeline代码模板
- settings.py Scrapy爬虫的配置文件
- spiders/ Spiders代码模板目录,存放这个工程中所建立的爬虫
- _init_.py 初始文件
- _pycache_/ 缓存目录
在一个工程中创建一个Spider模板
在demo文件中输入以下命令
scrapy genspider demo123 python123.io
可以看到在demo/spiders中增加了一个demo123.py文件。
demo123.py
初始代码:
# -*- coding: utf-8 -*-
import scrapy
class Demo123Spider(scrapy.Spider):
name = 'demo123' # 当前爬虫名字
allowed_domains = ['python123.io'] # 提交给命令行的域名
start_urls = ['http://python123.io/'] # scrapy框架索要爬取的页面
# def start_request(self):
# urls = [
# 'http://python123.io/ws/demo.html'
# ]
# for url in urls:
# yield scrapy.Request(url=url, callback=self.parse) # 节省空间,提高效率
#
def parse(self, response): # 处理响应
pass
yield关键字的使用
如果一个函数包含yield语句,那它就是一个生成器。生成器是一个不断产生值的函数。生成器中的yield产生一个值后函数被冻结,而这个值将返回。被再次唤醒后生成器将继续从这个位置执行。在这个过程中函数的局部变量是不变的。
实例:
def gen(n):
for i in range(n):
yield i**2
def squ(n):
ls = [i**2 for i in range(n)]
return ls
for i in gen(5):
print(i, '', end='')
for i in squ(5):
print(i, '', end='')
生成器的优势是节省存储空间、提高运行速度、使用更加灵活。在spider中使用yield可以在爬取大量网页的过程中节省空间,提高效率。
配置产生的spider爬虫
修改demo123.py文件,使它能够按照我们的要求去访问链接并提取数据。
# -*- coding: utf-8 -*-
import scrapy
class Demo123Spider(scrapy.Spider):
name = 'demo123'
#allowed_domains = ['python123.io']
start_urls = ['http://python123.io/ws/demo.html']
def parse(self, response): # response 是从Internet中返回的数据包
fname = response.url.split('/')[-1] # 从response中提取名字作为文件名
with open(fname, 'wb') as f:
f.write(response.body) # 将response中的内容保存到文件中
self.log('Saved file &s.' & name)
运行爬虫,获取网页
在命令行中输入命令
scrapy crawl demo123
在demo目录下将会生成demo123.html文件。
编写Item Pipeline
编辑在创建工程的时候得到的pipeline.py。
设计的数据类型
Request
由Spider生成最后由Downloader执行的的HTTP请求。
常用属性或方法 | 说明 |
---|---|
.url | Request对应的请求地址 |
.method | 对应的请求方法,‘GET’'POST’等 |
.headers | 字典类型的请求头 |
.body | 请求内容主体,字符串类型 |
.meta | 用户添加信息的拓展信息位,在Scrapy内部模块间传递信息使用 |
.copy | 复制该请求 |
Response
由Downloader生成最终给Spider处理的HTTP响应。
常用属性或方法 | 说明 |
---|---|
.url | Response对应的请求地址 |
.status | HTTP状态码,值是200说明成功接受 |
.headers | Response对应的头部信息 |
.body | Response对应的内容信息,字符串类型 |
.flags | 标记 |
.request | 产生Response对应的Request对象 |
.copy() | 复制该响应 |
Item
由Spider从HTML页面中提取最终交给Item Pipeline处理的信息内容(字典类型)。
信息提取方法
- Beautiful Soup
- lxml
- re
- XPath Selector
- CSS Selector
CSS Selector
CSS Selector是由W3C维护的一种信息提取方法。使用:
<HTML>.css('a::attr(href)').extract() # 通过标签名称(a)和标签属性(href)来得到对应的标签信息