Python爬虫 Scrapy七
简介
Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。
安装
pip install scrapy
遇到问题目前主要是网络问题,多试几次就好。最后解决方案使用使用anaconda
使用
创建项目
scrapy startproject [项目名称]
目录结构
-
spiders(数据解析器)
init.py
自定义的爬虫文件.py ‐‐‐> 由我们自己创建,是实现爬虫核心功能的文件 -
items.py ‐‐‐>定义数据结构的地方,是一个继承自scrapy.Item的类
-
middlewares.py ‐‐‐> 中间件 代理
-
pipelines.py ‐‐‐>管道文件,里面只有一个类,用于处理下载数据的后续处理
默认是300优先级,值越小优先级越高(1‐1000) -
settings.py ‐‐‐> 配置文件 比如:是否遵守robots协议,User‐Agent定义等
-
init.py
重要命令、方法
创建项目
scrapy startproject [项目名称]
创建爬虫文件
spiders目录下执行
scrapy genspider [爬虫名字] [网页的域名不带http]
<!--另一种模板-->
scrapy genspider ‐t crawl read www.dushu.com
可以查看scrapy爬虫的模板类型,这里使用默认的
执行爬虫
scrapy crawl [爬虫名称]
<!--注意:应在spiders文件夹内执行-->
response方法
response.text ‐‐‐》响应的是字符串
response.body ‐‐‐》响应的是二进制文件
response.xpath()‐》xpath方法的返回值类型是selector列表
response.status -> http状态
response.extract() ‐‐‐》提取的是selector对象的是data
response.extract_first() ‐‐‐》提取的是selector列表中的第一个数据
还有方法自己百度学习吧
yield
- 带有 yield 的函数不再是一个普通函数,而是一个生成器generator,可用于迭代
- yield 是一个类似 return 的关键字,迭代一次遇到yield时就返回yield后面(右边)的值。重点是:下一次迭代
时,从上一次迭代遇到的yield后面的代码(下一行)开始执行 - 简要理解:yield就是 return 返回一个值,并且记住这个返回的位置,下次迭代就从这个位置后(下一行)开始
参考下面示例,返回。注意看层级嵌套的处理
示例
创建:
spiders目录下执行scrapy genspider [爬虫名字] [网页的域名不带http]
自定义dangdang.py解析器
import scrapy
from scrapyproject.items import ScrapyprojectItem
class TcSpider(scrapy.Spider):
# 爬虫名称
name = 'dangdang'
# 可执行域名
allowed_domains = ['category.dangdang.com']
# 起始地址
start_urls = ['http://category.dangdang.com/cp01.21.04.03.00.00.html']
# 自定义的变量
base_url = 'http://category.dangdang.com/'
page = 1
def parse(self, response):
# response.text ‐‐‐》响应的是字符串
# response.body ‐‐‐》响应的是二进制文件
# response.xpath()‐》xpath方法的返回值类型是selector列表
# extract() ‐‐‐》提取的是selector对象的是data
# extract_first() ‐‐‐》提取的是selector列表中的第一个数据
# name_xpath = '//*[@id="component_59"]/li/a/@title'
# names = response.xpath(name_xpath)
# src_xpath = '//*[@id="component_59"]/li/a/img/@src'
# images = response.xpath(src_xpath)
# price_xpath = '//*[@id="component_59"]/li/p[@class="price"]/span[@class="search_now_price"]/text()'
# prices = (response.xpath(price_xpath))
# for index in range(len(names)):
# print("书名:", names[index].extract())
# print("图片:", images[index].extract())
# print("价格:", prices[index].extract())
# 相比以上写法,可得selector可以重复使用xpath方法
li_xpath = response.xpath('//*[@id="component_59"]/li')
for index in li_xpath:
name = index.xpath('.//a/@title').extract_first()
# print("书名:", name)
# print("图片:", index.xpath('.//a/img/@src').extract())
# 这里有反扒机制,图片懒加载
if index.xpath('.//a/img/@data-original').extract_first() is None:
image = index.xpath('.//a/img/@src').extract_first()
else:
image = index.xpath('.//a/img/@data-original').extract_first()
# print("图片:", image)
price = index.xpath('.//p[@class="price"]/span[@class="search_now_price"]/text()').extract_first()
# print("价格:", price)
item = ScrapyprojectItem(name=name, src=image, price=price)
yield item
# 手动调用请求
if self.page < 3:
c_url = self.base_url 'pg' str(self.page) '-cp01.21.04.03.00.00.html'
yield scrapy.Request(url=c_url, callback=self.parse)
管道pipelines
# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html
# useful for handling different item types with a single interface
from itemadapter import ItemAdapter
# 管道处理数据,在setting开启管道
# 读书网管道
class ScrapyprojectReadPipeline:
# 爬虫开始之前执行
def open_spider(self, spider):
# 定义一个变量存储数据
self.move = []
# 爬虫开始之后执行
def close_spider(self, spider):
print("一共条数据:",len(self.move))
# 关闭之前处理数据
with open('book.js', 'a', encoding='utf-8') as fp:
fp.write(str(self.move))
# 每个数据处理
def process_item(self, item, spider):
# 这个位置写入必须强转str
# 注意追加写入
# io消耗大,做批量处理最好
# with open('book.js', 'a', encoding='utf-8') as fp:
# fp.write(str(item))
self.move.append(item)
return item
配置settings
主要配置
# Obey robots.txt rules 爬虫规则遵守
ROBOTSTXT_OBEY = False
# Configure item pipelines
# See https://docs.scrapy.org/en/latest/topics/item-pipeline.html
# 开启管道
ITEM_PIPELINES = {
# 管道值越小优先级越高
# 'scrapyproject.pipelines.ScrapyprojectPipeline': 300,
# 自定义管道
# 'scrapyproject.pipelines.ScrapyprojectDangdangPipeline': 300,
# 电影天堂管道
# 'scrapyproject.pipelines.ScrapyprojectDYTTPipeline': 300,
# 读书网管道
'scrapyproject.pipelines.ScrapyprojectReadPipeline': 300,
}
scrapy shell
-
什么是scrapy shell?
Scrapy终端,是一个交互终端,供您在未启动spider的情况下尝试及调试您的爬取代码。其本意是用来测试提取数据的代码,不过您可以将其作为正常的Python终端,在上面测试任何的Python代码。该终端是用来测试XPath或CSS表达式,查看他们的工作方式及从爬取的网页中提取的数据。 在编写您的spider时,该终端提供了交互性测试您的表达式代码的功能,免去了每次修改后运行spider的麻烦。
一旦熟悉了Scrapy终端后,您会发现其在开发和调试spider时发挥的巨大作用。 -
安装ipython
安装:pip install ipython
简介:如果您安装了 IPython,Scrapy终端将使用 IPython(替代标准Python终端)。 IPython终端与其他相
比更为强大,提供智能的自动补全,高亮输,及其他特性。 -
应用:
(1)scrapy shell www.百度.com
(2)scrapy shell http://www.百度.co
了解即可,目前我不用
自定义请求
参考示例,主要是针对方法的重写
class ReadBookSpider(CrawlSpider):
# 注意版本,喝视频方法不一致
def _parse(self, response):
print(' ')
li_xpath = response.xpath('//div[@class="bookslist"]/ul/li')
for index in li_xpath:
name = index.xpath('.//h3/a/text()').extract_first()
src = index.xpath('.//h3/a/@href').extract_first()
item = ScrapyprojectItem(name=name, src=src)
yield item
# 请求之前,在这里可以处理参数等问题
def start_requests(self):
# post请求,处理里面参数
yield scrapy.FormRequest(url='', formdata={}, callback=self._parse)
# get请求
yield scrapy.Request(url='', callback=self._parse)
注意setting里面还很多全局设置需要查看资料
setting设置
获取setting文件参数
from scrapy.utils.project import get_project_settings
params = settings['params']
(1)日志级别:
CRITICAL:严重错误
ERROR: 一般错误
WARNING: 警告
INFO: 一般信息
DEBUG: 调试信息
默认的日志等级是DEBUG
只要出现了DEBUG或者DEBUG以上等级的日志那么这些日志将会打印
(2)settings.py文件设置:
默认的级别为DEBUG,会显示上面所有的信息10.scrapy的post请求
代理
在配置文件中 settings.py
LOG_FILE : 将屏幕显示的信息全部记录到文件中,屏幕不再显示,注意文件后缀一定是.log
LOG_LEVEL : 设置日志显示的等级,就是显示哪些,不显示哪些
该框架只是学了皮毛,还需要多练习 查文档,在自己使用中基本Selenium就足够
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhfihhjf
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13