python爬虫技术简介-Python网络爬虫——Scrapy框架简介和应用

本文详细介绍了Scrapy爬虫框架的使用,包括环境安装、创建项目、编写爬虫文件、爬虫类的属性和方法、数据解析以及持久化存储。Scrapy具有异步爬取和高性能数据解析等功能,适用于网页数据抓取。文章通过实例展示了如何通过终端指令和自定义管道实现数据的CSV存储和数据库持久化,并强调了日志级别配置。
摘要由CSDN通过智能技术生成

一.什么是Scrapy?

Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,非常出名,非常强悍。所谓的框架就是一个已经被集成了各种功能(高性能异步下载,队列,分布式,解析,持久化等)的具有很强通用性的项目模板。对于框架的学习,重点是要学习其框架的特性、各个功能的用法即可。

- scrapy:爬虫框架

- 具有哪些功能:异步爬取,高性能的数据解析+持久化存储操作

- 框架:集成了很多功能且具有很强通用性的一个项目模板

- 如何学习框架:

- 学习框架爱的功能模块的具体使用

- 环境的安装:

- linux

- pip3 install scrapy

- windows

- 1.pip3 install wheel

- 2.下载twisted http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted

- 3.进行下载目录,执行pip3 install Twisted?19.7.0?cp37?cp37m?win_amd64.whl

- 4.pip3 install pywin32

- 5.pip3 install scrapy

- 使用流程:

- 创建一个工程:scrapy startproject firstBlood

- cd firstBlood(进入项目目录)

- 创建爬虫文件:scrapy genspider first www.xxx.com

- 执行:scrapy crawl first 【不显示日志后面加--nolog】

- 目录图片:

1763071-20190924105417370-447354399.png

scrapy.cfg 项目的主配置信息。(真正爬虫相关的配置信息在settings.py文件中)

items.py 设置数据存储模板,用于结构化数据,如:Django的Model

pipelines 数据持久化处理

settings.py 配置文件,如:递归的层数、并发数,延迟下载等

spiders 爬虫目录,如:创建文件,编写爬虫解析规则

- 编写爬虫文件:在步骤2执行完毕后,会在项目的spiders中生成一个应用名的py爬虫文件,文件源码如下:

#-*- coding: utf-8 -*-

importscrapyclassQiubaiSpider(scrapy.Spider):

name= 'qiubai' #应用名称

#允许爬取的域名(如果遇到非该域名的url则爬取不到数据)【一般注释掉】

allowed_domains = ['https://www.qiushibaike.com/']#起始url列表:列表中存放的url都会被scray进行自动的请求发送

start_urls = ['https://www.qiushibaike.com/']#访问起始URL并获取结果后的回调函数,该函数的response参数就是向起始的url发送请求后,获取的响应对象.该函数返回值必须为可迭代对象或者NUll

defparse(self, response):print(response.text) #获取字符串类型的响应内容

print(response.body)#获取字节类型的相应内容

- 设置修改settings.py配置文件相关配置:

修改内容及其结果如下:

19行:USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36' # 伪装请求载体身份

22行:ROBOTSTXT_OBEY = False # 可以忽略或者不遵守robots协议

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

- 执行爬虫程序:scrapy crawl 应用名称【后面加--nolog,不会输出日志文件】

- 持久化存储:

- 基于终端指令:scrapy crawl qiubai -ofilepath.csv

- 好处:便捷

- 弊端:局限性强(只可以将数据写入本地文件,文件后缀有要求)

- 基于管道

- 基于持久化存储的所有操作都必须写入到管道文件的管道类中

- 日志类型:INFO DEBUG ERROR

- LOG_LEVEL= 'ERROR'【setting最后加入这句,日志只打印错误信息】

总结:

- scrapy框架基本使用

- 创建工程

- 终端指令:scrapy startproject ProName

- 创建爬虫文件【创建在指定目录中】

- cd ProName

- scrapy genspider SpiderName www.xxx.com

- 爬床类的相关属性和方法

- 爬虫文件的名称:name【名称唯一】【运行时通过name找到对应文件】

- 起始的url列表:start_urls【存储url,会被scrapy自动的请求发送,有多少url就发送多少期请求】

- parse方法:【用来解析start_urls列表中url对应的响应数据,start_urls中有多少url就调用多少次parse方法】

- response.xpath()【返回存储selector对象的列表】-->[selector,selector]

- extract()【拿到xpath返回所有列表中selector对象】

- extract_first()【拿到selector对象列表中对应的第0个数据】

- 数据持久化存储

- 基于终端指令持久化存储

- scrapy crawl SpiderName -o ./file【执行爬虫文件时】

- 只可以将parse方法的返回值进行持久化存储【将解析到的数据以字典形式添加到列表中】

- 基于管道持久化存储

- 编码流程:

- 数据解析【parse方法】

- 在item类中声明相关属性,用于存储解析到的数据【xxx = scrapy.Field()】

- 将解析到的数据存储封装到item类型的对象中【item = item文件中的类()】【item['xxx']=xxx】

- 将item对象提交给给管道类【yield item】

- item会被管道类中的proce_item方法中的item参数进行接收

- process_item方法中编写基于item持久化存储的操作【存储到本地/数据库】

- 在配置文件【setting】中开启管道

- 管道细节处理:

- 管道文件中一个类对应的是什么?

- 一个类表示的是将解析到的数据存储到某一个具体的平台中

- process_item方法中的返回值表示什么含义?

- 【return item】是将item传递给下一个即将被执行的管道类

- open_spider,close_spider

- 重写父类的两种方法,爬虫开启,爬虫结束各调用一次

实例:城市名获取

#1.爬虫文件#-*- coding: utf-8 -*-

importscrapyfrom pachong.items importPachongItemclassA111Spider(scrapy.Spider):

name= '111'

#allowed_domains = ['www.xxx.com']

start_urls = ['https://www.aqistudy.cn/historydata/']defparse(self, response):

lis= response.xpath('//div[@class="hot"]/div[2]/ul/li')for li inlis:

city_name= li.xpath('./a/text()').extract_first()

item=PachongItem()

item['city_name'] =city_nameyielditem

# ------------------------------------------------------------------#2.items文件#-*- coding: utf-8 -*-

#Define here the models for your scraped items#

#See documentation in:#https://doc.scrapy.org/en/latest/topics/items.html

importscrapyclassPachongItem(scrapy.Item):#define the fields for your item here like:

#name = scrapy.Field()

city_name =scrapy.Field()

#-----------------------------------------------------------------#3.pipelines管道文件#-*- coding: utf-8 -*-

#Define your item pipelines here#

#Don't forget to add your pipeline to the ITEM_PIPELINES setting#See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html

classPachongPipeline(object):

f=Nonedefopen_spider(self,spider):print('开始爬取数据......')

self.f= open('./111.txt','w',encoding='utf-8')defprocess_item(self, item, spider):

city_name= item['city_name']

self.f.write(city_name+' ')returnitemdefclose_spider(self,spider):print('结束爬取......')

self.f.close()

#-------------------------------------------------------------#4.setting文件#-*- coding: utf-8 -*-

#Scrapy settings for pachong project

BOT_NAME= 'pachong'SPIDER_MODULES= ['pachong.spiders']

NEWSPIDER_MODULE= 'pachong.spiders'

#Crawl responsibly by identifying yourself (and your website) on the user-agent

USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'

#Obey robots.txt rules

ROBOTSTXT_OBEY =False#Configure item pipelines#See https://doc.scrapy.org/en/latest/topics/item-pipeline.html

ITEM_PIPELINES ={'pachong.pipelines.PachongPipeline': 300,

}#设置显示的日志类型

LOG_LEVEL = 'ERROR'

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值