09 Scrapy框架在爬虫中的使用

一、简介

Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。它集成高性能异步下载,队列,分布式,解析,持久化等。

Scrapy 是基于twisted框架开发而来,twisted是一个流行的事件驱动的python网络框架。因此Scrapy使用了一种非阻塞(又名异步)的代码来实现并发。它是爬虫界最知名的框架。就好比web框架中的django。Scrapy之所以能实现异步,得益于twisted框架。twisted有事件队列,哪一个事件有活动,就会执行!

1. 安装

Linux:pip3 install scrapy

Windows:

a. pip3 install wheel

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

c. shift右击进入下载目录,执行 pip3 install typed_ast-1.4.0-cp36-cp36m-win32.whl

d. pip3 install pywin32

e. pip3 install scrapy

 2.工作过程:

  • 用户编写爬虫主程序将需要下载的页面请求requests递交给引擎
  • 引擎将请求转发给调度(调度实现了优先级、去重等策略)
  • 调度从队列中取出一个请求,交给引擎转发给下载器(引擎和下载器中间有中间件,作用是对请求加工如:对requests添加代理、ua、cookie,response进行过滤等)
  • 下载器取回页面后,交由引擎转发给爬虫主程序解析,这个时候解析函数将产生两类数据,一种是items、一种是requests(新请求),其中requests按上面步骤交给调度器;items交给数据管道(数据管道实现数据的最终处理)

3.scrapy基本命令行

(1)创建一个新的项目
scrapy startproject ProjectName

(2).生成爬虫
scrapy genspider +SpiderName+website

(3)运行(crawl)             # -o output
scrapy crawl +SpiderName
scrapy crawl SpiderName -o file.json
scrapy crawl SpiderName-o file.csv

(4)check检查错误
scrapy check

(5)list返回项目所有spider名称
scrapy list

(6). view 存储、打开网页
scrapy view https://www.baidu.com

(7). scrapy shell,进入终端
scrapy shell https://www.baidu.com

(8). scrapy runspider
scrapy runspider zufang_spider.py

官方使用文档:https://docs.scrapy.org/en/latest/

二、基础使用

以麦田租房信息爬取为例,网站http://bj.maitian.cn/zfall/PG1

1.创建项目

scrapy startproject houseinfo

生成项目结构:

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

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

pipelines     数据持久化处理

settings.py   配置文件

spiders       爬虫目录

2.创建爬虫应用程序

cd houseinfo
scrapy genspider maitian maitian.com

然后就可以在spiders目录下看到我们的爬虫主程序

3.编写爬虫文件

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

 1 # -*- coding: utf-8 -*-
 2 import scrapy
 3
 4
 5 class MaitianSpider(scrapy.Spider):
 6     name = ‘maitian‘                        # 应用名称
 7     allowed_domains = [‘maitian.com‘]       #一般注释掉,允许爬取的域名(如果遇到非该域名的url则爬取不到数据)
 8     start_urls = [‘http://maitian.com/‘]    #起始爬取的url列表,该列表中存在的url,都会被parse进行请求的发送
 9
10     #解析函数
11     def parse(self, response):
12         pass

我们可以在此基础上,根据需求进行编写

 1 # -*- coding: utf-8 -*-
 2 import scrapy
 3
 4 class MaitianSpider(scrapy.Spider):
 5     name = ‘maitian‘
 6     start_urls = [‘http://bj.maitian.cn/zfall/PG100‘]
 7
 8
 9     #解析函数
10     def parse(self, response):
11
12         li_list = response.xpath(‘//div[@class="list_wrap"]/ul/li‘)
13         results = []
14         for li in li_list:
15             title =  li.xpath(‘./div[2]/h1/a/text()‘).extract_first().strip()
16             price = li.xpath(‘./div[2]/div/ol/strong/span/text()‘).extract_first().strip()
17             square = li.xpath(‘./div[2]/p[1]/span[1]/text()‘).extract_first().replace(‘㎡‘,‘‘)            # 将面积的单位去掉
18             area = li.xpath(‘./div[2]/p[2]/span/text()[2]‘).extract_first().strip().split(‘\xa0‘)[0]        # 以空格分隔
19             adress = li.xpath(‘./div[2]/p[2]/span/text()[2]‘).extract_first().strip().split(‘\xa0‘)[2]
20
21             dict = {
22                 "标题":title,
23                 "月租金":price,
24                 "面积":square,
25                 "区域":area,
26                 "地址":adress
27             }
28             results.append(dict)
29
30             print(title,price,square,area,adress)
31         return results

须知:

  • xpath为scrapy中的解析方式
  • xpath函数返回的为列表,列表中存放的数据为Selector类型数据。解析到的内容被封装在Selector对象中,需要调用extract()函数将解析的内容从Selector中取出。
  • 如果可以保证xpath返回的列表中只有一个列表元素,则可以使用extract_first(), 否则必须使用extract()

两者等同,都是将列表中的内容提取出来

title =  li.xpath(‘./div[2]/h1/a/text()‘).extract_first().strip()

title =  li.xpath(‘./div[2]/h1/a/text()‘)[0].extract().strip()

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

1 #伪装请求载体身份
2 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‘
3
4 #可以忽略或者不遵守robots协议
5 ROBOTSTXT_OBEY = False  

5.执行爬虫程序:scrapy crawl  maitain

三、数据持久化存储

  • 基于终端指令的持久化存储
  • 基于管道的持久化存储

1. 基于终端指令的持久化存储

  将parse方法的返回值持久化存储到本地的文本中(此方法parse必须有返回值,也就是return后的内容

  执行输出指定格式进行存储:将爬取到的数据写入不同格式的文件中进行存储,windows终端不能使用txt格式

  • scrapy crawl 爬虫名称 -o xxx.json
  • scrapy crawl 爬虫名称 -o xxx.xml
  •  scrapy crawl 爬虫名称 -o xxx.csv

以麦田为例,spider中的代码不变,将返回值写到qiubai.csv中。本地没有,就会自己创建一个。本地有就会追加

scrapy crawl maitian   -o maitian.csv

就会在项目目录下看到,生成的文件

查看文件内容

2.基于管道的持久化存储

scrapy框架中已经为我们专门集成好了高效、便捷的持久化操作功能,我们直接使用即可。要想使用scrapy的持久化操作功能,我们首先来认识如下两个文件:

  • items.py数据结构模板文件。定义数据属性。
  • pipelines.py管道文件。接收数据(items),进行持久化操作。

持久化流程:

① 爬虫文件爬取到数据解析后,需要将数据封装到items对象中。

② 使用yield关键字将items对象提交给pipelines管道进行持久化操作。

③ 在管道文件中的process_item方法中接收爬虫文件提交过来的item对象,然后编写持久化存储的代码将item对象中存储的数据进行持久化存储在管道的process_item方法中执行io操作,进行持久化存储    

④ settings.py配置文件中开启管道

2.1保存到本地的持久化存储

爬虫文件:maitian.py

 1 import scrapy
 2 from houseinfo.items import HouseinfoItem               # 将item导入
 3
 4 class MaitianSpider(scrapy.Spider):
 5     name = ‘maitian‘
 6     start_urls = [‘http://bj.maitian.cn/zfall/PG100‘]
 7
 8     #解析函数
 9     def parse(self, response):
10
11         li_list = response.xpath(‘//div[@class="list_wrap"]/ul/li‘)
12
13         for li in li_list:
14             item = HouseinfoItem(
15                 title =  li.xpath(‘./div[2]/h1/a/text()‘).extract_first().strip(),
16                 price = li.xpath(‘./div[2]/div/ol/strong/span/text()‘).extract_first().strip(),
17                 square = li.xpath(‘./div[2]/p[1]/span[1]/text()‘).extract_first().replace(‘㎡‘,‘‘),
18                 area = li.xpath(‘./div[2]/p[2]/span/text()[2]‘).extract_first().strip().split(‘\xa0‘)[0],
19                 adress = li.xpath(‘./div[2]/p[2]/span/text()[2]‘).extract_first().strip().split(‘\xa0‘)[2]
20             )
21
22             yield item                      # 提交给管道,然后管道定义存储方式

items文件:items.py

1 import scrapy
2
3 class HouseinfoItem(scrapy.Item):
4     title = scrapy.Field()          #存储标题,里面可以存储任意类型的数据
5     price = scrapy.Field()
6     square = scrapy.Field()
7     area = scrapy.Field()
8     adress = scrapy.Field()

管道文件:pipelines.py

 1 class HouseinfoPipeline(object):
 2     def __init__(self):
 3         self.file = None
 4
 5     #开始爬虫时,执行一次
 6     def open_spider(self,spider):
 7         self.file = open(‘maitian.csv‘,‘a‘,encoding=‘utf-8‘)                    # 选用了追加模式
 8         self.file.write(",".join(["标题","月租金","面积","区域","地址","\n"]))
 9         print("开始爬虫")
10
11     # 因为该方法会被执行调用多次,所以文件的开启和关闭操作写在了另外两个只会各自执行一次的方法中。
12     def process_item(self, item, spider):
13         content = [item["title"], item["price"], item["square"], item["area"], item["adress"], "\n"]
14         self.file.write(",".join(content))
15         return item
16
17     # 结束爬虫时,执行一次
18     def close_spider(self,spider):
19         self.file.close()
20         print("结束爬虫")

配置文件:settings.py

 1 #伪装请求载体身份
 2 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‘
 3
 4 #可以忽略或者不遵守robots协议
 5 ROBOTSTXT_OBEY = False
 6
 7 #开启管道
 8 ITEM_PIPELINES = {
 9    ‘houseinfo.pipelines.HouseinfoPipeline‘: 300,                    #数值300表示为优先级,值越小优先级越高
10 }

未完待续!

原文地址:https://www.cnblogs.com/Summer-skr--blog/p/11477117.html

时间: 2024-07-29 07:37:12

09 Scrapy框架在爬虫中的使用的相关文章

零基础写python爬虫之使用Scrapy框架编写爬虫

网络爬虫,是在网上进行数据抓取的程序,使用它能够抓取特定网页的HTML数据.虽然我们利用一些库开发一个爬虫程序,但是使用框架可以大大提高效率,缩短开发时间.Scrapy是一个使用Python编写的,轻量级的,简单轻巧,并且使用起来非常的方便.使用Scrapy可以很方便的完成网上数据的采集工作,它为我们完成了大量的工作,而不需要自己费大力气去开发. 首先先要回答一个问题. 问:把网站装进爬虫里,总共分几步? 答案很简单,四步: 新建项目 (Project):新建一个新的爬虫项目 明确目标(Item

Requests爬虫和scrapy框架多线程爬虫

1.基于Requests和BeautifulSoup的单线程爬虫 1.1 BeautifulSoup用法总结 1. find,获取匹配的第一个标签 tag = soup.find('a') print(tag) tag = soup.find(name='a', attrs={'class': 'sister'}, recursive=True, text='Lacie') tag = soup.find(name='a', class_='sister', recursive=True, te

基于scrapy框架的爬虫

Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中. scrapy 框架 高性能的网络请求 高性能的数据解析 高性能的持久化存储 深度爬取 全站爬取 分布式 中间件 请求传参 环境的安装 mac/linux:pip install scrapy windows: pip install wheel twisted(异步相关,scrapy 的异步由twisted实现) 一定要在twisted安装成功的情况下执行后面的

Scrapy 框架,爬虫文件相关

Spiders 介绍 由一系列定义了一个网址或一组网址类如何被爬取的类组成 具体包括如何执行爬取任务并且如何从页面中提取结构化的数据. 简单来说就是帮助你爬取数据的地方 内部行为 #1.生成初始的Requests来爬取第一个URLS,并且标识一个回调函数 第一个请求定义在start_requests()方法内默认从start_urls列表中获得url地址来生成Request请求默认的回调函数是parse方法.回调函数在下载完成返回response时自动触发 #2.在回调函数中,解析respons

scrapy框架【爬虫的暂停和启动】

scrapy的每一个爬虫,暂停时可以记录暂停状态以及爬取了哪些url,重启时可以从暂停状态开始爬取过的URL不在爬取 实现暂停与重启记录状态 方法一: 1.首先cd进入到scrapy项目里(当然你也可以通过编写脚本Python文件直接在pycharm中运行) 2.在scrapy项目里创建保存记录信息的文件夹 3.执行命令: scrapy crawl 爬虫名称 -s JOBDIR=保存记录信息的路径 如:scrapy crawl cnblogs -s JOBDIR=zant/001 执行命令会启动

基于Scrapy框架的Python新闻爬虫

概述 该项目是基于Scrapy框架的Python新闻爬虫,能够爬取网易,搜狐,凤凰和澎湃网站上的新闻,将标题,内容,评论,时间等内容整理并保存到本地 详细 代码下载:http://www.demodashi.com/demo/13933.html 一.开发背景 Python作为数据处理方面的一把好手,近年来的热度不断增长.网络爬虫可以说是Python最具代表性的应用之一,那么通过网络爬虫来学习Python以及网络和数据处理的相关内容可以说是再合适不过了. Scrapy是由Python语言开发的一

一个令人着迷的爬虫框架——Scrapy框架!

在平常的知识传播中,我经常遇到许多的小伙伴说,Python爬虫还厉害喔,我想学,或者是我已经初学了Python,但是爬虫还是没有接触,能教教我吗?看到小伙伴有如此热情,我决定来带大家探讨探讨Python爬虫! 在探讨爬虫之前,我们首先来带大家了解下 Scrapy 框架,我们先来解答三个问题:什么是 Scrapy 框架呢?它有什么作用呢?为什么需要使用它?(这个有基础的想必解答不难) 如果大家在学习Python的路上,或者打算学习Python需要学习资料,可以私信小编发送1314,小编将免费赠送大

Python爬虫进阶(Scrapy框架爬虫)

准备工作:           配置环境问题什么的我昨天已经写了,那么今天直接安装三个库                        首先第一步:                            (我们要用到scrapy框架,在python里调用windows 命令,使用mongodb存储爬到的数据 )                                  进入DOS python/Script>路径下  输入命令: python/Script> pip install p

教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神

欢迎加入Python学习交流群:535993938  禁止闲聊 ! 名额有限 ! 非喜勿进 ! 本博文将带领你从入门到精通爬虫框架Scrapy,最终具备爬取任何网页的数据的能力.本文以校花网为例进行爬取,校花网:http://www.xiaohuar.com/,让你体验爬取校花的成就感. Scrapy,Python开发的一个快速,高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据.Scrapy用途广泛,可以用于数据挖掘.监测和自动化测试. Scrapy吸引人的地方在于