python爬虫scrapy框架用法是什么?
Admin 2021-08-18 群英技术资讯 970 次浏览
这篇文章主要介绍了python爬虫scrapy框架用法的用法,对于新手学习scrapy框架有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章能有所收获,接下来小编带着大家一起了解看看。
sudo pip3 install scrapy
2.1 scrapy架构图
Scrapy Engine(引擎)
: 负责Spider
、ItemPipeline
、Downloader
、Scheduler
中间的通讯,信号、数据传递等。Scheduler(调度器)
: 它负责接受引擎
发送过来的Request请求,并按照一定的方式进行整理排列,入队列,当引擎
需要时,交还给引擎
。Downloader(下载器)
:负责下载Scrapy Engine(引擎)
发送的所有Requests请求,并将其获取到的Responses交还给Scrapy Engine(引擎)
,由引擎
交给Spider
来处理Spider(爬虫)
:它负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎
,再次进入Scheduler(调度器)
Item Pipeline(管道)
:它负责处理Spider
中获取到的Item,并进行进行后期处理(详细分析、过滤、存储等)的地方.Downloader Middlewares(下载中间件)
:你可以当作是一个可以自定义扩展下载功能的组件Spider Middlewares(Spider中间件)
:可以理解为是一个可以自定扩展和操作引擎
和Spider
中间通信
的功能组件(比如进入Spider
的Responses和从Spider
出去的Requests)2.2 Scrapy运行的大体流程:
1.引擎从spider拿到第一个需要处理的URL,并将request请求交给调度器。
2.调度器拿到request请求后,按照一定的方式进行整理排列,入队列,并将处理好的request请求返回给引擎。
3.引擎通知下载器,按照下载中间件的设置去下载这个request请求。
4.下载器下载request请求,并将获取到的response按照下载中间件进行处理,然后后交还给引擎
,由引擎
交给spider
来处理。对于下载失败的request,引擎会通知调度器进行记录,待会重新下载。
5.spider拿到response,并调用回调函数(默认调用parse函数)去进行处理,并将提取到的Item数据和需要跟进的URL交给引擎。
6.引擎将item数据交给管道进行处理,将需要跟进的URL交给调度器,然后开始循环,直到调度器中不存在任何request,整个程序才会终止。
2.3 制作scrapy爬虫步骤:
1.创建项目:通过(scrapy startproject 项目名)来创建一个项目
2.明确目标:编写items.py文件,定义提取的Item
3.制作爬虫:编写spiders/xx.py文件,爬取网站并提取Item
4.存储内容:编写pipelines.py文件,设计管道来存储提取到的Item(即数据)
3.1 创建项目在开始爬虫之前,第一步需要创建一个项目。先进入打算存储代码的目录,运行以下命令:
scrapy startproject myProject
其中myProject为项目名,运行上述命令后,在当前目录下会创建一个myProject目录,该目录包含以下内容:
. ├── myProject │ ├── __init__.py │ ├── items.py │ ├── middlewares.py │ ├── pipelines.py │ ├── settings.py │ └── spiders │ └── __init__.py └── scrapy.cfg
scrapy.cfg:项目的配置文件
myProject/items.py:项目中的目标文件
myProject/middlewares.py:项目中的中间件文件
myProject/pipelines.py:项目中的管道文件
myProject/settings.py:项目中的设置文件
myProject/spiders:放置spider代码的目录
3.2 明确目标(定义Item)
我们打算抓取网站http://www.itcast.cn/channel/teacher.shtml里所有老师的姓名、职称、入职时间和个人简介:
import scrapy class MyprojectItem(scrapy.Item): name = scrapy.Field() title = scrapy.Field() hiredate = scrapy.Field() profile = scrapy.Field()
3.3 制作爬虫在项目根目录下输入以下命令,可以在myProject/spiders目录下创建一个名为itcast的爬虫(itcast.py),并且指定爬虫作用域的范围itcast.cn:
scrapy genspider itcast itcast.cn
打开itcast.py,默认添上了以下内容:
import scrapy class ItcastSpider(scrapy.Spider): name = 'itcast' allowed_domains = ['itcast.cn'] start_urls = ['http://itcast.cn/'] def parse(self, response): pass
要建立一个Spider, 你必须用scrapy.Spider类创建一个子类,并确定了3个强制的属性和1个方法。
name:
这个爬虫的识别名称,必须是唯一的allow_domains:
爬虫的约束区域,规定爬虫只爬取这个域名下的网页,不存在的URL会被忽略。start_urls:
爬取的URL列表。因此,第一个被获取到的页面将是其中之一。 后续的URL则从初始URL返回的数据中提取。parse(self, response):
Request对象默认的回调解析方法。每个初始URL完成下载后将被调用,调用的时候传入从每一个URL传回的Response对象来作为唯一参数,该方法负责解析返回的数据(response.body),提取数据(生成item)以及生成需要进一步处理的URL的Request对象修改start_urls为第一个需要爬取的URL:
start_urls = ['http://www.itcast.cn/channel/teacher.shtml#ajavaee']
修改parse方法提取Item:
def parse(self, response): for teacher in response.xpath("//ul[@class='clears']/li/div[@class='main_mask']"): #将提取到到的数据封装到一个MyprojectItem对象中 item = MyprojectItem() #利用xpath返回该表达式所对应的所有节点的selector list列表 #调用extract方法序列化每个节点为Unicode字符串并返回list name = teacher.xpath('h2/text()').extract()[0] title = teacher.xpath('h2/span/text()').extract()[0] hiredate = teacher.xpath('h3/text()').extract()[0].split(':')[-1] profile = teacher.xpath('p/text()').extract()[0] item['name'] = name item['title'] = title item['hiredate'] = hiredate item['profile'] = profile # 使用yield将获取的数据交给pipelines,如果使用return,则数据不会经过pipelines yield item
3.4 存储内容
Feed输出
如果仅仅想要保存item,可以不需要实现任何的pipeline,而是使用自带的Feed输出(Feed export)。主要有以下4种方式,通过-o指定输出文件格式:
# json格式,默认为Unicode编码 scrapy crawl itcast -o itcast.json # json lines格式,默认为Unicode编码 scrapy crawl itcast -o itcast.jsonl #csv 逗号表达式,可用Excel打开 scrapy crawl itcast -o itcast.csv # xml格式 scrapy crawl itcast -o itcast.xml
执行这些命令后,将会对爬取的数据进行序列化,并生成文件。
编写Item Pipeline(通用):
这个方法必须返回一个Item (或任何继承类)对象, 或是抛出 DropItem异常。
参数是被爬取的item和爬取该item的spider
spider程序每yield一个item,该方法就会被调用一次
open_spider(self,spider):开启spider的时候调用,只执行1次
close_spider(self,spider):关闭spider的时候调用,只执行1次
item写入json文件:
import json from itemadapter import ItemAdapter class MyprojectPipeline: def open_spider(self,spider): '''可选实现,开启spider时调用该方法''' self.f = open('itcast.json','w') def process_item(self, item, spider): '''必须实现,被抛弃的item将不会被后续的pipeline组件所处理''' self.f.write(json.dumps(dict(item),ensure_ascii=False)+'\n') return item def close_spider(self,spider): '''可选实现,关闭spider时调用该方法''' self.f.close()
启用Item Pipeline组件
ITEM_PIPELINES = { 'myProject.pipelines.MyprojectPipeline': 300, }
在settings.py文件里添加以上配置(可以取消原有的注释),后面的数字确定了item通过pipeline的顺序,通常定义在0-1000范围内,数值越低,组件的优先级越高
启动爬虫
scrapy crawl itcast
查看当前目录下是否生成了itcast.json文件
Scrapy终端是一个交互终端,我们可以在未启动spider的情况下尝试及调试代码,也可以用来测试XPath或CSS表达式,查看他们的工作方式,方便我们爬取的网页中提取的数据。
启动scrapy shell
scrapy shell <url>
命令行启动,url是要爬取的网页的地址
常见可用对象
selector选择器
Selector有四个基本的方法,最常用的还是xpath:
Selector有四个基本的方法,最常用的还是xpath:
Spider类定义了如何爬取某个(或某些)网站。包括了爬取的动作(例如:是否跟进链接)以及如何从网页的内容中提取结构化数据(爬取item)。
scrapy.Spider是最基本的类,所有编写的爬虫必须继承这个类。
import scrapy class XxSpider(scrapy.Spider): pass
主要用到的函数及调用顺序为:
其他方法
log(self, message, level=log.DEBUG)
message:字符串类型,写入的log信息
level:log等级,有CRITICAL、 ERROR、WARNING、INFO、DEBUG这5种,默认等级为DEBUG
快速创建CrawlSpider模板:
scrapy genspider -t crawl 爬虫名 爬虫域
scrapy.spiders.CrwalSpider是编写的爬虫所必须继承的类
from scrapy.spiders import CrawlSpider class XxSpider(CrawlSpider): pass
CrawlSpider类继承于Spider类,它定义了一些规则(rule)来提供跟进link的方便的机制,从爬取的网页中获取link并继续爬取的工作更适合。
LinkExtractor
class scrapy.spiders.LinkExtractor
allow:满足括号中“正则表达式”的值会被提取,如果为空,则全部匹配。
deny:与这个正则表达式(或正则表达式列表)匹配的URL一定不提取。
allow_domains:会被提取的链接的domains。
deny_domains:一定不会被提取链接的domains。
restrict_xpaths:使用xpath表达式,和allow共同作用过滤链接。
rules
class scrapy.spiders.Rule
在rules中包含一个或多个Rule对象,每个Rule对爬取网站的动作定义了特定操作。如果多个rule匹配了相同的链接,第一个会被使用。
Rule对象主要参数:
CrawSpider爬虫示例
以阳光热线问政平台http://wz.sun0769.com/political/index/politicsNewest?id=1为例,爬取投诉帖子的编号、帖子的标题,帖子的处理状态和帖子里的内容。
import scrapy from scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider, Rule from myProject.items import MyprojectItem class SunSpider(CrawlSpider): name = 'sun' allowed_domains = ['wz.sun0769.com'] start_urls = ['http://wz.sun0769.com/political/index/politicsNewest?id=1&page=1'] rules = ( Rule(LinkExtractor(allow=r'id=\d+&page=\d+')),#每一页的匹配规则,callback为None,默认跟进 Rule(LinkExtractor(allow=r'politics/index\?id=\d+'), callback='parse_item'),#每个帖子的匹配规则,设置了callback,默认不跟进 ) def parse_item(self, response): item = MyprojectItem() title = response.xpath('//div[@class="mr-three"]/p[@class="focus-details"]/text()').extract()[0] #帖子标题 status = response.xpath('//div[@class="focus-date clear focus-date-list"]/span[3]/text()').extract()[0].split()[1] #处理状态 number = response.xpath('//div[@class="focus-date clear focus-date-list"]/span[4]/text()').extract()[0].split(':')[-1] #帖子编号 content = response.xpath('//div[@class="details-box"]/pre/text()').extract()[0] #帖子内容 item['title'] = title item['status'] = status item['number'] = number item['content'] = content yield item
Scrapy提供了log功能,通过在setting.py中进行设置,可以被用来配置logging
设置
示例:
#在settings.py中任意位置添上以下两句,终端上会清爽很多 LOG_FILE = "xxx.log" LOG_LEVEL = "INFO"
8、Request对象
GET请求
class Request(object_ref): def __init__(self, url, callback=None, method='GET', headers=None, body=None, cookies=None, meta=None, encoding='utf-8', priority=0, dont_filter=False, errback=None, flags=None, cb_kwargs=None): pass
主要参数:
POST请求
下载中间件是处于引擎(crawler.engine)和下载器(crawler.engine.download())之间的一层组件,可以有多个下载中间件被加载运行。
当引擎传递请求给下载器的过程中,下载中间件可以对请求进行处理 (例如增加http header信息,增加proxy信息等);
在下载器完成http请求,传递响应给引擎的过程中, 下载中间件可以对响应进行处理(例如进行gzip的解压等)
要激活下载器中间件组件,将其加入到settings.py中的DOWNLOADER_MIDDLEWARES 设置中。 该设置是一个字典(dict),键为中间件类的路径,值为其中间件的顺序(order)。例如:
DOWNLOADER_MIDDLEWARES = { 'myProject.middlewares.MyprojectDownloaderMiddleware': 543, }
中间件组件是一个定义了以下一个或多个方法的Python类:
示例:(使用随机User-Agent和代理IP)
middlewares.py文件
import random import json import redis from scrapy import signals from itemadapter import is_item, ItemAdapter from myProject.settings import USER_AGENTS class MyprojectDownloaderMiddleware: def __init__(self): self.r = redis.StrictRedis(host='localhost') #创建redis连接客户端,用于取里面存储的动态获取的代理ip def process_request(self, request, spider): user_agent = random.choice(USER_AGENTS) #取随机user-Agent proxy_list = json.loads(self.r.get('proxy_list').decode()) proxy = random.choice(proxy_list) #取随机ip request.headers.setdefault("User-Agent",user_agent) #设置user-agent request.meta['proxy'] ='http://'+proxy['ip']+':'+str(proxy['port']) #使用代理ip
修改settings.py文件配置
#禁用cookies COOKIES_ENABLED = False #设置下载延迟 DOWNLOAD_DELAY = 3 #添加自己写的下载中间件类 DOWNLOADER_MIDDLEWARES = { 'myProject.middlewares.MyprojectDownloaderMiddleware': 543, } #添加USER-AGENTS USER_AGENTS = [ "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)", "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)", "Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)", "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 287 c9dfb30)", "Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6", "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1", "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0", "Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5" ]
以上就是关于python爬虫scrapy框架的用法介绍,希望对大家学习scrapy框架有帮助,想要了解更多python爬虫的内容,大家可以关注其他相关文章。
文本转载自脚本之家
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
程序能一次写完并正常运行的概率很小,基本不超过1%,总会有各种各样的bug需要修正。有的bug很简单,看看错误信息就知道,有的bug很复杂,
什么是树表查询,基于Python怎样实现二叉排序树?一些朋友可能会遇到这方面的问题,对此在下文小编向大家来讲解一下,内容详细,易于理解,希望大家阅读完这篇能有收获哦,有需要的朋友就往下看吧!
这篇文章主要给大家分享的是关于Python文件的操作,下面有详细介绍Python文件读写原理、常用文件打开模式、文件对象的常用方法、目录的相关操作,对Python新手学习具有一定的借鉴价值,感兴趣的朋友就跟随小编一起来了解一下吧。
pyqtSignal的基本使用,一些朋友可能会遇到这方面的问题,对此在下文小编向大家来讲解一下,内容详细,易于理解,希望大家阅读完这篇能有收获哦,有需要的朋友就往下看吧!
很多新手学习python时,对于多进程和多线程不是很清楚,为了帮助大家更好的学习和理解多进程和多线程,这篇文章就给大家介绍关于PHP多进程和多线程的使用,下面有详细的介绍以及代码,供大家参考学习。
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008