Python 网络爬虫笔记10 – Scrapy 使用入门
Python 网络爬虫系列笔记是笔者在学习嵩天老师的《Python网络爬虫与信息提取》课程及笔者实践网络爬虫的笔记。
课程链接:Python网络爬虫与信息提取
参考文档:
Requests 官方文档(英文)
Requests 官方文档(中文)
Beautiful Soup 官方文档
re 官方文档
Scrapy 官方文档(英文)
Scrapy 官方文档(中文)
一、Scrapy 使用简化步骤
1、建立一个 Scrapy 爬虫工程
# 打开 cmd ,cd到要创建工程的目录,输入命令
scrapy startproject scrapy_demo
工程的文件结构:
scrapy_demo/ # 工程根目录
scrapy.cfg # 部署Scrapy爬虫的配置文件
scrapy_demo/ # Scrapy框架的用户自定义Python代码
__pycache__/ # 缓存目录,无需修改
spiders/ # piders代码模板目录(继承类),此目录下可添加自定义的spider代码
__init__.py # 初始文件,无需修改
__pycache__/ # 缓存目录,无需修改
__init__.py # 初始化脚本
items.py # Items代码模板(继承类)
middlewares.py # Middlewares代码模板(继承类)
pipelines.py # Pipelines代码模板(继承类)
settings.py # Scrapy爬虫的配置文件
2、在工程中产生一个Scrapy爬虫
作用:
# 打开 cmd ,cd到 Scrapy工程的目录,输入命令(爬取的网站网址为可选参数)
scrapy genspider demo python123.io
自动生成的 demo.py :
# -*- coding: utf-8 -*-
import scrapy
class DemoSpider(scrapy.Spider):
name = 'demo'
allowed_domains = ['python123.io']
start_urls = ['http://python123.io/ws/demo.html']
# 处理响应,解析由Downloader生成Response对象
def parse(self, response):
pass
3、配置产生的spider爬虫
配置内容:
- 设置初始URL地址
- 编写获取页面后的解析方法
修改后的 demo.py(普通版):
# -*- coding: utf-8 -*-
import scrapy
class DemoSpider(scrapy.Spider):
"""
普通版
"""
name = 'demo'
# allowed_domains = ['python123.io']
start_urls = ['http://python123.io/ws/demo.html']
# 解析Response对象,保存HTML文件
def parse(self, response):
file_name = response.url.split('/')[-1]
with open(file_name, 'wb') as f:
f.write(response.body)
self.log('Saved file %s.' % file_name)
修改后的 demo.py(yield版):
# -*- coding: utf-8 -*-
import scrapy
class DemoSpider(scrapy.Spider):
"""
yield 版
"""
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):
file_name = response.url.split('/')[-1]
with open(file_name, 'wb') as f:
f.write(response.body)
self.log('Saved file %s.' % file_name)
4、运行爬虫,获取网页
# 打开 cmd ,cd到 Scrapy工程的目录,输入命令
scrapy crawl demo
二、Scrapy 使用标准步骤
- 创建一个工程和Spider模板
- 编写Spider编写Spider
- 编写Item Pipeline编写Item Pipeline
- 优化配置策略优化配置策略
三、Scrapy 数据类型
1、Request 类:class scrapy.http.Request()
- Request对象表示一个HTTP请求,由Spider生成,由Downloader执行
属性或方法 | 说明 |
---|---|
.url | Request对应的请求URL地址 |
.method | 对应的请求方法,‘GET’ 'POST’等 |
.headers | 字典类型风格的请求头 |
.body | 请求内容主体,字符串类型 |
.meta | 用户添加的扩展信息,在Scrapy内部模块间传递信息使用 |
.copy() | 复制该请求 |
2、Response 类:class scrapy.http.Response()
- Response对象表示一个HTTP响应,由Downloader生成,由Spider处理
属性或方法 | 说明 |
---|---|
.url | Response对应的URL地址 |
.status | HTTP状态码,默认是200 |
.headers | Response对应的头部信息 |
.body | Response对应的内容信息,字符串类型 |
.flags | 一组标记 |
.request | 产生Response类型对应的Request对象 |
.copy() | 复制该响应 |
3、Item 类:class scrapy.item.Item()
- Item对象表示一个从HTML页面中提取的信息内容,由Spider生成,由Item Pipeline处理
- Item类似字典类型,可以按照字典类型操作
四、CSS Selector
- 用来检索HTML网页的内容
# 格式
<HTML>.css('标签名称::attr(标签属性)').extract()
# 示例
<HTML>.css('a::attr(href)').extract()