目录

11.1认识Scrapy

11.1.1安装所需依赖包

11.1.2认识Scrapy

11.2Scrapy shell的使用

11.2.1运行shell

11.2.2使用Scrapy shell爬取Scrapy.org

11.2.3爬虫调用shell

11.3使用Scrapy爬取qutoes

11.3.1 创建Scrapy项目并新建爬虫

11.3.2爬取和提取数据

11.4 setting基本设置

11.5Pipeline模块

11.5.1 爬取文字板块

11.5.2编写pipeline模块

11.5.3通不过pipeline将数据写入MongoDB数据库中


写程序的时候,别人写好的工具、库、框架被称作轮子。有现成的,写好的东西不用,自己又去写一遍,这叫做重复造轮子。今天来认识爬虫的常见轮子Scrapsdy。

11.1认识Scrapy

11.1.1安装所需依赖包

Scrapy安装前需要先安装依赖包,不然会因缺少依赖包导致安装失败,如下表

lxml parsel w3lib twisted cryptography pyOenSSL
解析XML和HTML非常高校的工具 HTML.XML数据提取 网页解码 异步网络编程框架 用于加密 进行一些加解密操作

这些包可以通过pip单独安装。也可以先创建一个requirements.txt文件,然后把包名写入并保存即可

lxml
parsel
w3lib
twisted
crptography
pyOpenSSL

然后终端输入

pip install -r requirements.txt

11.1.2认识Scrapy

Scrapy是一个用于抓取网页并提取数据的应用框架。即使Scrapy最初是被设计用于网页爬取,但同样也可以用于提取API数据。

接下来通过一个简单的Scrapy爬虫例子来展示Scrapy的用法。这里有一段爬取国外名人名言网页的代码

import scrapyclass QuotesSpider(scrapy.Spider):name = "quotes"start_urls = ['http://quotes.toscrape.com/tag/humor'   #待抓取的URL]def parse(self, response):                     #parse默认为抓取回调函数,再次定义抓取网页后的操作for quote in response.css('div.quote'):yield {'text':quote.css('span.text::text').extract_first(),'author':quote.xpath('span/small/text()').extract_first()}next_page = response.css('li.next a::attr("href")').extract_first()     #使用css选择器找到下一页链接if next_page is None:yield response.follow(next_page,self.parse)       #访问下一页,回调到parse函数

将代码保存为spider.py文件,然后在当前目录下用命令运行爬虫,输入:scrapy runspider qutoes_spider.py -o quotes.json

当爬虫运行结束,会得到一个quotes.json文件,打开发现是一个列表里面包含列经过json格式化的名人名言。字段有作者、内容,就像下面这样。

scrapy的优点之一就是发送请求,调度和处理是异步进行的,这意味着scrapy不需要等待请求完成才能进行处理,他可以同时发送其他请求活着做其他事情。也就是说,即使有一些请求失败或者发生错误,其他的请求也会照常工作。

同样,它也允许进行快速爬取(用容错率高的方式,同时发送大量的并发请求。因为速度加快会导致爬取失败)。Scrapy在setting中提供列一些选择可以让我们使用比较暴力的方式进行爬取,可以在两个请求之间设置延迟,也可以限制每个网站或者IP的并发请求量。

其他超赞的功能:

支持使用css选择去或者xpath从HTML/XML源码中枷锁和提取数据

交互式的shell在爬虫和debugging的时候非常有用。

支持多种格式的输出:如json,csv,xml,并提供多种方式存储如(FTP,s3,本地文件)

一些非标准的或其他国家的语言,Scrapy能够很好的进行编码

可以自行编写属于自己的函数,实现自己的需求

11.2Scrapy shell的使用

Scrapy shell是一个可交互的终端,可以在不运行爬虫状态下快速的调试代码,其本意是用来测试提取数据的代码。在shell理,你可以测试xpath或者css的表达式,通过从网页提取的数据判断是否正确。当适应列Scrapy shell以后就会发现这是一个相当好用的开发和debugging工具。

11.2.1运行shell

打开终端直接运行:Scrapy shell <URL> ,<URL>填写想爬取的网页的URL,当然填写本地的html文件路径也是可以的。

shelp()调出帮助菜单

fetch()从定义的URL中获取一个新的response对象

view(response) 用浏览器打开一个response对象,这个对象被保存在本地

11.2.2使用Scrapy shell爬取Scrapy.org

官方有一个如何使用shell的简单例子,这个例子是通过shell来直接抓取一个网页,并对返回的对象进行解析和查看,让我们可以快速了解shell的各种功能。终端输入:

scrapy shell "https://Scrapy.org" --nolog

这里有很多个选项,但一般用到的只有response、request、fetch等几个。response是Scrapy shell请求返回的对象,可以对response对象进行数据提取的操作。request则是请求的方式,默认为GET,可以修改为POST。

开始调式对象:

>>> response.xpath('//title/text()').extract_first()  #使用xpath提取标题>>> fetch("https://www.baidu.com")        #抓取百度网址
>>> response.xpath('//title/text()').extract()  #提取百度网址的标题

使用xpath对response对象进行数据提取,获取网页标题。fetch方法可以发起一个新的请求。抓住新的URL。通过request方法修改请求方式为POST。使用pprint打印response对象headers属性得到的结果。

使用Scrapy shell可以对网页快速请求获取response,使用xpath从源码中提取数据进行调试,同时Scrapy shell还可以修改请求的方式和请求头。在编写Scrapy爬虫之前,使用Scrapy shell进行调试可以帮助编写爬虫过程中少犯错误。

11.2.3爬虫调用shell

有时候检查response爬虫是必不可少的一个重要环节。这时候可以是使用Scrapy.shell。inspect_response函数。

(1)首先创建项目test2。

scrapy startproject test

(2)创建文件spider.py,并保存在spiders目录下。

import scrapyclass MySpider(scrapy.Spider):name =  "myspider"start_urls = ["http://example.com","http://example.org","http://example.net"]def parse(self,response):if ".org" in response.url:from scrapy.shell import inspect_responseinspect_response(response,self)

(3)在test2目录下(scrapy.cfg所在的那层目录),运行爬虫

scrapy crawl myspider

爬虫运行的时候,shell同样会被调用。

然后可以通过操作response对相关检查各项参数或者提取数据。如response.url查看response对象的url。

11.3使用Scrapy爬取qutoes

现在开始建立自己的爬虫项目去爬取quotestoscrape.com,名人名言网站。建立项目需要完成以下简单几个步骤:

(1)创建自己的Scrapy项目。

(2)编写一个网页爬虫并抓取数据。

(3)通过命令行输入数据

(4)让爬虫自动爬取下一页内容

(5)学会使用爬虫参数

11.3.1 创建Scrapy项目并新建爬虫

在开始爬取之前,需要新建一个scrapy的项目。在当前目录下运行中福安输入命令:

scrapy startproject tutorial

spider是定义的爬虫类,用来编写爬取网页的逻辑。编写爬虫的类的class是必须继承scrapy.Spider。同时需要定义最初的URL,可以通过列表形式的start_urls,也可以通过start_requests()函数来定义。发起的请求会回调到parse函数。在parse函数下选择如何进入下一页,还有如何解析下载回来的网页内容以便提取数据,这是第一个爬虫代码,命名为quotes_spider.py保存在tutorial/spiders目录下。(quotes-1,quotes-1是我已经运行过代码所得到的网页源码)

quotes_spider.py文件代码如下:

import scrapy
from scrapy import Request
class QuotesSpider(scrapy.Spider):name = "quotes"def start_requests(self):urls = ['http://quotes.toscrape.com/page/1/','http://quotes.toscrape.com/page/2/']for url in urls:yield Request(url=url,callback=self.parse)def parse(self, response):page = response.url.split("/")[-2]filename = 'quotes-%s.html' %pagewith open(filename,'wb') as f :f.write(response.body)self.log('Saved file %s' %filename)"""
class QuotesSpider(scrapy.Spider):name = "quotes"def start_requests(self):start_urls = ['http://quotes.toscrape.com/page/1/','http://quotes.toscrape.com/page/2/']def parse(self, response):page = response.url.split("/")[-2]filename = 'quotes-%s.html' % pagewith open(filename, 'wb') as f:f.write(response.body)
"""

从代码中可以看到爬虫继承列scrapy.Spider并且定义列一些参数和方法:

name:是爬虫的名字,必须是唯一的。

start_requests():你可以返回一个请求的列表,里面是URL,或者自己写一个生成器的功能。这是爬虫开始爬取的一个或多个连接。

urls:存储爬取连接的列表,遍历列表,yeid可以不中断函数并发起下一个请求。

parse():从start_requests()下载回来的网页内容回调到parse()。下载回来的内容是一个response对象,然后从中提取数据并找到新的URL进行下一页的爬取。

11.3.2爬取和提取数据

运行爬虫需要在项目的目录最顶层运行命令(在scrapy.cfg的同层目录)就下面这个目录。输入命令:scrapy crawl quotes.

然后爬虫会运行刚刚新建的名字为quotes的爬虫,它会发送请求到网站quotes.toscrape.com

这时候当前目录下有两个新文件被创建列:quotes-1.html和quotes-2.html,里面的内容是刚才爬取的两个网页的源代码。

除了使用start_requests()这个函数来请求开始请求URL,还可以使用更简单的方式定义start_urls列表。上面多行注释掉的代码。

"""
class QuotesSpider(scrapy.Spider):name = "quotes"def start_requests(self):start_urls = ['http://quotes.toscrape.com/page/1/','http://quotes.toscrape.com/page/2/']def parse(self, response):page = response.url.split("/")[-2]filename = 'quotes-%s.html' % pagewith open(filename, 'wb') as f:f.write(response.body)
"""

请求每一个URL返回的response会默认回调到parse方法中。对入门者来说提取数据是一个比较头疼的问题。因为对工具和网页源码的不熟悉,很难准确定位到数据的位置。通过shell来学习数据提取是一个不错的选择。

在终端输入命令:

scrapy shell "http://quotes.toscrape.com/page/1/"

通过shell可以使用css选择器来选择对象里的元素。

这里返回的是一个类似列表的对象,但我们需要的是从列表对象中提取文本内容。这里我们‘::text’,意思是只选择文本内容,如果没有这个的话,它会返回连标签页一起返回。

这里返回的对象还是个列表,列表有时候会有多个文本内容,如:

['<title>Quotes to scrape1<title> '],
'<title>Quotes to scrape1<title> '],'<title>Quotes to scrape2<title> '],'<title>Quotes to scrape4<title> ']

但如果确定返回的文本内容就是列表中的第一个元素Quotes  to Scrape1,可以直接用:

11.4 setting基本设置

Scrapy中有一个setting.py的文件,里面是Scrapy的爬取配置。如果打开可以发现,里面很多配置都被注释掉了没有使用。所以Scrapy在爬取过程中很多功能并没有被激活。

重新开始创建一个Scrapy项目

scrapy startproject myproject

settings.py文件,Scrapy的配置就写在里面。不管是禁用功能还是激活功能都在配置中执行。

(1)在配置中默认激活的有:

BOT_NAME这个很好理解,指爬虫爬虫的名字。而爬虫模块myproject.spiders是编写爬虫爬取逻辑的所在。机器人守则ROBOTSTXT,有一些网站是存在ROBOTSTXT的。在守则中网站 站长会告诉你它不允许你爬取他的网站,或者网站中哪些地方不希望被爬取。所以,爬虫其实不是什么内容都能爬的。常用的搜索引擎百度、谷歌就是个大爬虫。但是如此强大的搜索网站,也有搜索不到的内容。比如说QQ空间的日志,因为QQ空间ROBOTSTXT告诉列这些搜索网站的爬虫,自己不希望被爬取。所以无法通过搜索获取到的内容的。

(2)如果已经对Scrapy的基础有所了解,那应该记得在使用Scrapy爬取数据的过程中会使用到item。item使一个存放数据的容器,通过item.py进行定义。然后爬虫模块通过import进行使用。但是最后数据流转到哪个模块中进行清洗或者保存,需要在ITEM_PIPELINES中进行配置。

ITEM_PIPELINES = {'myproject.pipelines.YOURCLASS':300}

例如上面的myproject.pipelines.YOURCLASS指在myproject项目下pipeline模块中的YOURCLASS类需要使用到item,后面的数字300代表优先级,数字越小优先级越高。

(3)DEFAULT_REQUEST_HEADERS默认使用的请求头。爬虫伪装最简单的手段,伪装请求头。scrapy使用的请求头:

DEFAULT_REQUEST_HEADERS = {'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8','Accept-Language':'en','User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36'
}

细心观察,这个请求头中没有USER_AGENT。那是因为Scrapy基本配置有着独立的USER_AGENT参数。

USER_AGENT = 'myproject(+http://www.yourdomain.com)'

这个USER_AGENT由项目名+爬取目标URL构成,这个很奇怪。平时使用的USER_AGENT是各种浏览器的请求头信息。对方湾站是根据请求头信息来获取你的系统浏览器信息,然后返回数据。请求头分不同浏览器,如火狐,谷歌,Opear,不同的系统:pc和手机。有时候有些网站你想要获取他的手机页面的数据,必须使用手机请求头才能成功。

(4)DOWNLOAD_DELAY下载延迟。爬虫爬取的过程是一个不断向目标网站发起请求的过程,过快的爬取速度会给对方服务器造成负担,变成一种共计行为。所以DOWNLOAD_DELAY这个参数的存在,设置了爬取的间隔时间。

(5)CONCURRENT_REQUESTS控制下载并发数,默认为个并发。如果完成一次操作要的时间是0.25秒,16个并发每秒会产生64个请求。

(6)CONCURENT_REQUESTS_PER_IP对单个进行并发请求的最大值,这个设定为非0的时候,DOWNLOAD_DELAY延迟作用在IP上而不是网站上。

(7)CONCURENT_REQUESTS_PER_DOMAIN对 单个网站进行并发请求的最大值

11.5Pipeline模块

Pipeline翻译成中文是管道的意思,是抓取数据通往数据库的通道。而在这个管道里,我们可以对抓取的数据进行处理。数据抓取过程中,数据会保存在Item模块,然后流转到Pipeline模块中进行处理。在Pipeline模块中,可以通过自己编写的方法对数据进行保存、下载等操作。

11.5.1 爬取文字板块

上一节中已经创建列一个myproject的项目,现在可以直接在这个项目上编写爬虫,用来爬取糗事百科的文字板块。

(1)进入myproject/spiders目录下新建爬虫spider.py文件。

import scrapy
from myproject.items import MyprojectItemclass MySpider(scrapy.Spider):name = "qiushibaike"start_urls = ["https://www.qiushibaike.com/text"]def parse(self, response):items = MyprojectItem()self.log('A response from %s just arrived!' % response.url)

编写列一个简单的爬虫逻辑,从start_urls进行爬取,结果返回到parse函数当中,这时候在顶层目录中打开终端运行爬虫的话会不成功,因为我们还没设置一些东西可能。然后我们接着配置我们的setting.py文件,关闭机器人守则,并且设置请求头

然后在顶层目录下打开终端输入命令:scrapy crawl qiushibaike

请求成功后,糗事百科的源码保存在列response对象中,接下来就要从源码中提取数据并保存到容器中。

(3)打开item.py文件,代码如下

import scrapyclass MyprojectItem(scrapy.Item):# define the fields for your item here like:# name = scrapy.Field()content = scrapy.Field()

定义列一个字段-内容。spider.py在import之后,可以直接使用MyprojectItem保存数据

(4)编辑spider.py文件

import scrapy
from myproject.items import MyprojectItemclass MySpider(scrapy.Spider):
#通过xpath提取内容name = "qiushibaike"start_urls = ["https://www.qiushibaike.com/text"]def parse(self, response):contents = response.selector.xpath('//div[@class="content"]/span/text()').extract()#定义items作为数据暂存容器items = MyprojectItem()for i in contents:items['content'] = i.strip()yield items#通过生成器yield将数据传送到Pipeline进一步处理self.log('A response from %s just arrived!' % response.url)

打开终端,输入命令:scrapy crawl qiushibaike

从控制台打印的内容可以看到items变量已经成功获得内容并将内容提交到pipeline当中。但是现在还没写pipeline,所以当前数据没有做任何处理。

11.5.2编写pipeline模块

已经从源代码中抓取列数据,现在要通过Pipeline模块来对数据进行处理。进入myproject项目,打开pipelines.py然后将其中代码改成一下代码。

代码的意思是得到数据之后,我们要写入到data.json这个文件中,代码是写好了,但是还没激活啊。我们需要到settings.py文件进行激活处理。进入settings.py文件中添加下面的代码:

ITEM_PIPELINES = {'myproject.pipelines.MyprojectPipeline':300}

然后进入目录顶层输入运行命令:scrapy  crawl qiushibaike

运行完成之后我们就可以看到data.json文件了,打开文件就可以看到我们抓取的内容。

在MyprojectPipeline()中,process_item()是必须的方法,在爬取过程调用对数据进行处理,处理完之后必须将item返回。另外open_spider()和close_spider()两个方法,前者是爬虫运行时调用,后者是爬虫关闭时调用。他们都只会运行一次。这两个方法不是必须的,可以根据自己的需求添加功能。

11.5.3通过pipeline将数据写入MongoDB数据库中

了解Pipeline模块的使用方法之后,继续拓展将数据写入MongoDB数据库上中。上一届提到MyprojectPipeline(),还有open_spider()和close_spider()两个方法,分别是爬虫运行时和爬虫运行结束后进行调用的。可以使用open_spider来链接数据,而clos_spider来关闭数据库链接。另外还需要增加一个from_crawler()的方法,主要功能为从配置文件settings.py中获取参数。当然也可以将参数写在Pipeline模块中,但是开发流程里所有参数都会放到一个配置文件中。

(1)打开配置文件settings.py添加如下代码

MONGO_URI = 'localhost:27017'
MONGO_DB = 'scrapy_data'ITEM_PIPELINES = {'myproject.pipelines.MyprojectPipeline':300,'myproject.pipelines.Mongopipeline':350}

最终的代码如下

(2)打开pipeline.py文件添加如下代码,这个类在上面的setting中是已经激活了的。

class Mongopipeline(object):def __init__(self,mongouri,mongodb):self.mongouri = mongouriself.mongodb = mongodb@classmethoddef from_crawler(cls,crawler):return cls(mongouri = crawler.settings.get("MONGO_URI"),mongodb = crawler.settings.get("MONGO_DB"))def process_item(self,item,spider):self.db.qiushibaike.insert(dict(item))return itemdef open_spider(self,spider):self.client = pymongo.MongoClient(self.mongouri)self.db = self.client[self.mongodb]def close_spider(self,spider):self.client.close()

在控制台终端输入运行爬虫命令:scrapy crawl qiushibaike

进入数据库进行查看

今天的scrapy框架先写到这里,后续会对他更新一下,因为有好几个板块需要更新的。

Python爬虫11-Scrapy爬虫框架相关推荐

  1. python3 scrapy爬虫_Python3 Scrapy爬虫框架(Scrapy/scrapy-redis)

    Python3 Scrapy爬虫框架(Scrapy/scrapy-redis) 本文由 Luzhuo 编写,转发请保留该信息. 原文: https://blog..net/Rozol/article/ ...

  2. Python项目----基于Scrapy爬虫框架的豆瓣电影数据采集

    基于Scrapy爬虫框架的豆瓣电影数据采集 项目介绍 项目简介 项目开发环境 项目需求分析 Scrapy框架 Scrapy框架基础知识 Scrapy框架安装 Scrapy框架使用 项目功能实现 爬虫主 ...

  3. 【Python爬虫】Scrapy爬虫框架

    Scrapy爬虫框架介绍 pip install scrapyscrapy -h 更好地理解原理: Scrapy爬虫框架解析 requests库和Scarpy爬虫的比较 Scrapy爬虫的常用命令 s ...

  4. python scrapy框架爬虫_Python Scrapy爬虫框架

    Scrapy爬虫框架结构: 数据流的3个路径: 一: 1.Engine从Spider处获得爬取请求(Request) 2.Engine将爬取请求转发给Scheduler,用于调度 二: 3.Engin ...

  5. PHP如何启动scrapy,python,_新手Scrapy爬虫运行问题,python - phpStudy

    新手Scrapy爬虫运行问题 新人刚开始学习Scrapy,成功安装Scrapy,运行第一个程序还是报错,望高手帮忙解答,感激不尽 错误提示 Traceback (most recent call la ...

  6. Python网络爬虫之scrapy爬虫的基本使用

    Scrapy爬虫的数据类型: 1. Request类:向网络上提交请求,跟requests库里的不是一个类型!2. Responce类:封装爬取内容3. ITEM:spider封装类 Responce ...

  7. python爬虫天气实例scrapy_2017.08.04 Python网络爬虫之Scrapy爬虫实战二 天气预报...

    1.项目准备:网站地址:http://quanzhou.tianqi.com/ 2.创建编辑Scrapy爬虫: scrapy startproject weather scrapy genspider ...

  8. PyCharm 2022.2 发布了,支持最新 Python 3.11 和 PyScript 框架!

    △点击上方"Python猫"关注 ,回复"1"领取电子书 来源:Jet Brains官网:翻译:Python猫 原文:https://blog.jetbrain ...

  9. python spider 安装_Python爬虫(11):Scrapy框架的安装和基本使用

    大家好,本篇文章我们来看一下强大的Python爬虫框架Scrapy.Scrapy是一个使用简单,功能强大的异步爬虫框架,我们先来看看他的安装. Scrapy的安装 Scrapy的安装是很麻烦的,对于一 ...

  10. python scrapy框架爬虫_Python Scrapy爬虫框架学习

    Scrapy 是用Python实现一个为爬取网站数据.提取结构性数据而编写的应用框架. 一.Scrapy框架简介 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数 ...

最新文章

  1. ZooKeeper内部原理
  2. sphinx 全文搜索引擎
  3. Delphi 与 DirectX 之 DelphiX(12): TPictureCollectionItem.DrawAlpha
  4. 【计算理论】计算理论总结 ( 上下文无关文法 CFG 转为下推自动机 PDA 示例 1 ) ★★
  5. Linux检查镜像,Shell脚本实现检测Cygwin最快的镜像站点
  6. 【机器视觉】 dev_update_time算子
  7. WebAPI(part1)--API及DOM
  8. 启动页面和各设备的宽高比及像素
  9. Java笔记-使用RabbitMQ的Java接口实现round-robin(轮询分发)
  10. linux AB测试
  11. Nginx基本数据结构之ngx_array_t
  12. “sudo: apt-get:找不到命令”的解决方法
  13. 【编译原理笔记10】语法制导翻译:在递归预测过程中进行翻译,L属性定义的自底向上翻译
  14. supercsv_SuperCSV – CsvBeanReader,CellProcessor,CsvBeanWriter
  15. c语言中islower是什么函数,C语言islower函数介绍、示例和实现
  16. 招聘senior.net software engineer
  17. 鸿蒙系统 Hi3861 实现手机APP配网功能
  18. MTK6763平台手机 在国外无法成功注册VOLTE。求解
  19. 天正电气T20 V6完全使用指南
  20. 基于Python实现Jacobi迭代法、Gauss-Seidel迭代法和SOR法方程组(二)

热门文章

  1. int, long, long long类型的范围
  2. jquery表格插件jqgrid
  3. vue侧边栏组件_画布侧边栏Vue组件
  4. 【wordpress】文章编辑器插件
  5. java实现数字金额转换成汉字大写金额
  6. HDU 4417 Super Mario(划分树)
  7. JS统计字符串中汉字的个数
  8. new bing聊天机器人免翻命令行使用--大佬逆向工程api
  9. 获取元素在屏幕的相对位置
  10. 今日春分|春生美好,万事可期