scrapy
简介
scrapy是一个专门用于异步爬虫的框架,框架可以理解为是一个被集成了很多功能且具有很强通用性的一个项目模板。
安装
1 终端输入
pip install scrapy
2 anaconda - environments - base(root) -search packages搜索scrapy下载,回到pycharm中import后直接下载,或是在preference-project interpreter 按+ 搜索后 install package
下载显示成功后在终端输入scrapy,没报错就说明下载成功
基础使用指令
- 创建
scrapy startproject ProName
scrapy startproject onePick
- 进入工程
cd ProName
cd onePick
- 创建爬虫源文件,网址可以创建后修改
- 在spider中创建爬虫文件,一般情况下只创建1个,name对应的属性值就是该爬虫文件,它是当前源文件的唯一标识
- 如果在spider中创建多个爬虫文件,name对应的属性值不可相同
scrapy genspider spiderName www.xxx.com
scrapy genspider one www.xxx.com
- 执行工程
- 在pycharm中只能使用指令执行,无法通过run 执行
- 不能同时执行多个爬虫文件,只能是一条指令执行一个
- 直接进行执行工程后,默认会输出工程的日志信息
scrapy crawl spiderName
scrapy crawl one
- 在创建爬虫源文件后,可先到
settings.py
中进行修改:- 写入
LOG_LEVEL = 'ERROR'
- 找到
ROBOTSTXT_OBEY = True
并修改为ROBOTSTXT_OBEY = False
- 找到UA并写入
- 写入
工程下的目录结构
duanziPro(ProName)
:创建工程后会生成一个工程同名的文件夹spider
:爬虫文件夹,该文件夹必须要存放一个爬虫源文件items.py
:可以理解为一种容器,存储爬取的数据pipelines.py
:管道类settings.py
:工程的配置文件scrapy.cfg
:配置文件
数据解析
- 测试流程
打开终端,进入指定文件夹内 cd 3\ scrapy
创建工程scrapy startproject onePick
进入工程cd onePick
创建爬虫文件scrapy genspider theOne www.xxx.com
打开settings.py
,做3步修改
打开theOne.py
import scrapy
# TheoneSpider 文件名+spider作方法名,Spider是它的父类
class TheoneSpider(scrapy.Spider):
# 爬虫文件的名称:当前源文件的唯一标识
name = 'theOne'
# 允许的域名(通常不用)
# 限定请求发送的URL,如在allowed_domains中指定了单独的域名,无论start_urls中有多少个域名都只能访问属于指定域名之下的URL
# allowed_domains = ['www.xxx.com']
# 起始URL列表:只可以存储URL
# 作用:列表中储存的URL都会被进行get请求的发送,如需要post要重写父类方法
start_urls = ['https://www.baidu.com/','https://www.sougou.com']
# 数据解析
# parse方法调用的次数取决于请求发送的次数(start_urls列表里的URL请求次数)
# response:表示的是服务器返回的响应对象
def parse(self, response):
print(response)
执行工程scrapy crawl theOne
- scrapy数据解析
使用response.xpath(‘xpath表达式’)
scrapy封装的xpath和etree中的xpath区别:
scrapy中的xpath直接将定位到的标签中存储的值或者属性值取出,返回的是Selector对象,且相关的数据值是存储在Selector对象的data属性中,需要调用extract、extract_first()取出字符串数据
import scrapy
class DuanziSpider(scrapy.Spider):
name = 'duanzi'
# allowed_domains = ['www.xxx.com']
start_urls = ['http://www.duanziku.com/gaoxiaoduanzi/']
# 数据解析
def parse(self, response):
paper_list = response.xpath('/html/body/div[5]/div[1]/ul')
for paper in paper_list:
# 返回Selector对象,数据存储在对象的data属性中
title = paper.xpath('./li/h3/a/text()')[0]
content = paper.xpath('./li/p[2]/text()')[0]
# .extract() 从Selector对象中取出data属性值,返回字符串
title = paper.xpath('./li/h3/a/text()')[0].extract()
content = paper.