1.Scrapy 介绍
(1)Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据
(2)特点:数据结构化、分布式
2.Scrapy 安装
2.1安装步骤
2.1.1 安装依赖包
2.1.1.1安装lxml
pip install lxml
2.1.1.2安装Twisted
(1)安装wheel:pip3 install wheel
(2)下载Twisted包
①下载链接:https://www.lfd.uci.edu/~gohlke/pythonlibs/
②下载后,打开下载文件的目录,打开cmd
输入:pip3 install Twisted-18.7.0-cp35-cp35m-win_amd64.whl
2.1.2 安装scrapy
(1)安装:pip install scrapy
(2)当我们安装好scrapy,并且有配置scrapy的环境变量(D:\python3.5.4\Scripts),假如之前配过就不用配了
(3)如果配置好之后,在命令行敲scrapy会有一下反应
3.Scrapy 基本命令与结构
3.1 基本命令
3.1.1 查看版本
3.1.2 创建项目
3.2结构
3.2.1 爬虫项目结构
3.2.2 爬虫结构
Scrapy是python编写的框架,类里面规则和python的一样
4.Scrapy爬虫步骤
4.1新建爬虫文件
4.2编写爬取代码(简单)
# coding:utf-8
import scrapy
class TestSpider(scrapy.spiders.Spider):
'''
TestSpider 我们定义的爬虫类
scrapy.spiders.Spider 是scrapy定义好的爬虫
'''
# 定义爬虫的名称,需唯一
name = "baiduSpider"
# 允许爬取的范围
allowed_domains = [
"https://www.baidu.com/"
]
# 默认爬取的起始点
start_urls = [
"https://www.baidu.com"
]
def parse(self,response):
'''
scrapy 会自动调用downloader的下载器,当请求成功scapy会自动调用parse,
将结果返回到parse的response参数上
'''
# 调试方法在是scrapy当中可以代替print
self.log(response.body.decode())
4.3创建启动文件
4.4 编写执行代码
4.5 settings设置
4.5.1 Scrapy默认请求头配置
找到HEADERS,取消注释,并添加上“UA”信息
4.5.2 设置不启动机器人协议
4.6 执行启动文件
4.6.1 执行后报错处理
提示:需安装win32的库
(1)下载对应python版本的win32的库
下载地址:https://sourceforge.net/projects/pywin32/files/pywin32/Build%20220/
(2)下载后点击安装后重新启动。成功爬取
5.Scrapy 请求处理
假如我们只是爬一个百度这样写是没有问题的,但是如果爬小说网站,请求头有变化,那么我们刚才配置默认请求头就不够用了,所以我们需要配置自己的请求头信息。(settings中的HEADERS重新注释掉)
5.1 生成器
(1)python 2.4版本之后更新出来的语法糖,可以很高效的减少程序内存损耗
Python2 : xrange
Python3 : range
(2)正常函数
使用return返回值,在调用函数时,输出相应的值
(3)yield函数
5.2 Request对象
在这里我们了解一个scrapy的request对象
首先request对象是由scrapy.Request方法创建
参数:
(1)url 请求的url
(2)callback=None 请求的回调函数,默认是parse
(3)method='GET', 请求的方式
(4)headers=None, 请求的头部
(5)body=None, 请求的正文,可以是bytes或者str
(6)cookies=None, 请求携带的cookie
(7)meta=None, 数是一个字典用于传递参数,这里可以带表单数据,也可以带代理如meta = {'proxy': 'xxx.xxxx.com:端口号'}
(8)encoding='utf-8', 字符集 url和body的字符集
(9)priority=0, 优先级,优先级越高,越先下载
(10)dont_filter=False, 是否对同一个url多次请求
(11)errback=None, 错误返回
(12)flags=None 标签
5.3代码部分
(1)代码
# coding:utf-8
import scrapy
from scrapy import Request
class TestSpider(scrapy.spiders.Spider):
'''
TestSpider 我们定义的爬虫类
scrapy.spiders.Spider 是scrapy定义好的爬虫
'''
# 定义爬虫的名称,需唯一
name = "baiduSpider"
# 继承并重写start_requests方法,定义url和headers
def start_requests(self):
url = "https://www.baidu.com/"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"
}
yield Request(url,headers=headers)
def parse(self,response):
'''
scrapy 会自动调用downloader的下载器,当请求成功scapy会自动调用parse,
将结果返回到parse的response参数上
'''
# 调试方法在是scrapy当中可以代替print
self.log(response.body.decode())
(2)结果
5.4 补充说明
(1)运行代码后没有报错:
spider关键字出错
数据匹配出错
UA头重复使用次数过多
(2)排错,从Spoder opened开始查找,爬取到的信息、warn、error
(2)allowed_domains,允许爬取范围www.baidu.com; Request里的meta参数是一个字典用于传递参数,这里可以带表单数据,也可以带代理如meta = {'proxy': 'xxx.xxxx.com:端口号'}