scrapy框架
- 什么是框架?
- 是一个集成了许多功能并具有极强通用性的项目模板
- 怎么学习框架?
- 专门学习框架封装好的各种功能的详细用法
- 什么是scrapy框架?
- 爬虫封装好的一个明星框架。功能:高性能的持久化存储、异步的数据下载、高性能的数据解析、分布式
- scrapy框架的基本使用
- 环境的安装
- windows:python3.8不存在问题
- pip install wheel
- 下载twisted地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/
- 安装twisted:pip install Twisted-20.3.0-cp38-cp38-win_amd64.whl(放在敲命令行所在的文件夹下)
- pip install pywin32
- pip install scrapy
- 注意点:按照上述步骤安装时,python3.7会报错
解决办法:
可能考虑到是python国内网络的问题,这时我们用国内的镜像源来加速。
pip install 包名 -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
- windows:python3.8不存在问题
- 创建一个工程:scrapy startproject ***pro
- 进入到爬虫项目中:cd ***pro
- 在spiders子目录中创建一个爬虫文件
- scrapy genspider spiderName www.xxx.com
- 执行工程
- scrapy crawl spiderName
练习中可以不遵从反爬机制
在setting.py配置文件中将ROBOTSTXT_OBEY改为False
在settings.py中添加LOG_LEVEL=‘ERROR’,只输出错位类型的日志
- scrapy crawl spiderName
- 环境的安装
-代码块
import scrapy
class FirstSpider(scrapy.Spider):
#爬虫文件的名称,也是爬虫源文件的唯一标识
name = 'first'
#允许的域名:用来限定start_urls列表中的哪些url可以进行请求发送
#allowed_domains = ['www.baidu.com']
#起始的url列表:该列表中存放的URL会被scrapy进行自动请求的发送
start_urls = ['https://www.baidu.com/','https://cn.bing.com/']
#用作于数据解析:response参数就是请求成功之后的响应对象
def parse(self, response):
print(response)
结果
- Scrapy数据解析
- xpath返回的是列表,但是列表元素一定是Selector类型的对象
- extract可以将对象中的data参数存储的字符串提取出来
- 列表调用了extract之后,则表示将列表中的每一个Selector对象中data对应的字符串提取了出来
# -*- coding: utf-8 -*-
import scrapy
class QiushibaikeSpider(scrapy.Spider):
name = 'qiushibaike'
# allowed_domains = ['www.XXX.com']
start_urls = ['https://www.qiushibaike.com/text/']
def parse(self, response):
div_list = response.xpath('//div[@class="col1 old-style-col1"]/div')
for div in div_list:
#xpath返回的是列表,但是列表元素一定是Selector类型的对象
#extract可以将Selector对象中的data参数存储的字符串提取出来
#author = div.xpath('./div[1]/a[2]/h2/text()')[0].extract()
author = div.xpath('./div[1]/a[2]/h2/text()').extract_first()
#列表调用了extract之后,则表示将列表中每一个Selector对象中data对应的字符串提取了出来
text = div.xpath('./a[1]/div/span//text()').extract()
text = ''.join(text)
print(author, text)
- join()函数
语法: ‘sep’.join(seq)
参数说明
sep:分隔符。可以为空
seq:要连接的元素序列、字符串、元组、字典
上面的语法即:以sep作为分隔符,将seq所有的元素合并成一个新的字符串
返回值:返回一个以分隔符sep连接各个元素后生成的字符串
例子:text = ‘’.join(text)
- 小技巧:
在不知道发生了何种错误的情况下,可以用print(‘ERROR’)放置在代码不同的位置,判断哪一行代码没有输出即错误。
- scrapy持久化存储**
- 基于终端指令的持久化存储
- 要求:只可以将parse方法的返回值存储到本地文本文件中
- 注意:持久化存储的文本文件类型只可以是’json’, ‘jsonlines’, ‘jl’, ‘csv’, ‘xml’, ‘marshal’, ‘pickle’
- 指令:scrapy crawl XXX -o filepath
- 优点:简单高效便捷
- 缺点:局限性比较强(只可以存储到指定后缀的文本文件中)
- 基于管道的持久化存储