技巧:爬虫0060:scrapy快速入门爬虫高级操作:Scrapy framework

优采云 发布时间: 2022-11-13 02:36

  技巧:爬虫0060:scrapy快速入门爬虫高级操作:Scrapy framework

  爬虫进阶操作:Scrapy框架章节内容Scrapy概述scrapy安装快速入门程序核心APIscrapy shell深度爬虫请求响应中间件-下载中间件常用设置与操作课程内容1.scrapy概述

  官方网站:打开官方网站,可以看到scrapy的描述

  An open source and collaborative framework for extracting the data you need from websites.

In a fast, simple, yet extensible way.

Scrapy is an application framework for crawling web sites and

extracting structured data which can be used for a wide range

of useful applications, like data mining, information processing

or historical archival.

Even though Scrapy was originally designed for web scraping,

it can also be used to extract data using APIs (such as Amazon

Associates Web Services) or as a general purpose web crawler.

  复制

  Scrapy 是一个应用程序框架,用于抓取 网站 数据并提取结构化数据。它可以用于一系列程序,包括数据挖掘、信息处理或存储历史数据。

  它最初是为网页抓取(更准确地说,网页抓取)而设计的,但也可用于获取 API(例如 Amazon Associates Web 服务)或通用网络爬虫返回的数据。

  2.scrapy安装

  首先,确保我们的电脑上已经安装了以下程序:

  运行命令执行安装

  pip install scrapy

  复制

  windows下需要单独安装调用win32的模块,执行如下命令安装

  pip install pypiwin32

  复制

  2.scrapy启动程序

  本部分主要内容如下

  创建scrapy项目定义数据提取数据Item写入采集数据的爬虫程序定义Pipline存储提取的数据

  (1) 创建scrapy项目

  执行以下命令创建第一个基于scrapy框架的爬虫项目

  scrapy startproject myspider

  复制

  此命令将在当前目录中创建以下文件结构

  |-- myspider

|-- scrapy.cfg

|-- myspider/

|-- __init__.py

|-- items.py

|-- pipeline.py

|-- settings.py

|-- spiders/

|-- __init__.py

...

  复制

  文件详情:

  (2)定义采集数据对象:Item

  Item 是用来保存爬取数据的容器。它是一个类似字典的对象。它的使用方式与 python 中的字典相同。Scrapy 提供了额外的保护机制来避免由拼写错误导致的字段未定义异常。

  可以基于scrapy.Item构造Item类型的创建,然后通过scrapy.Field()构造类型的属性,完成对采集的数据的描述

  首先根据从指定的网站[兆品招聘]获取的数据创建itemzhilianItem,然后通过scrapy.Field( )。属性,编辑 myspider/items.py 如下:

  # coding:utf-8

import scrapy

class ZhilianItem(scrapy.Item):

'''

基于scrapy.Item类型定义存储智联招聘数据的模型类

'''

# 定义采集数据的属性字段

job_name = scrapy.Field()

salary = scrapy.Field()

company = scrapy.Field()

  复制

  采集 的数据是按类型封装的。入门就像学习面向对象的定义类型,感觉会比较复杂,但是通过类型封装,可以统一数据管理,scrapy提供了更多的功能,可以通过Item类型直接操作,爬虫操作更简单又方便!

  (3)写第一个爬虫zhilianSpider

  蜘蛛是开发人员编写的用于从指定的 网站 中提取数据的类型

  爬虫类会收录一个用于爬取数据的初始url地址,以及网页中超链接深度提取的规则,以分析网页中的内容,并定义提取和生成Items的方法

  通过继承scrapy.Spider,可以很方便的构建一个爬虫处理类。该类型应收录以下三个属性:

  创建【智联招聘】爬虫程序:myspider/spiders/zhilianspider.py

  # coding:utf-8

# 引入scrapy模块

import scrapy

class ZhilianSpider(scrapy.Spider):

'''

智联招聘爬虫程序

'''

# 定义属性

name = "zlspider"

# 定义域名限制

allowed_domains = ['zhaopin.com']

# 定义起始url地址

start_urls = [

'http://sou.zhaopin.com/jobs/searchresult.ashx?jl=%E5%8C%97%E4%BA%AC&kw=django&sm=0&sg=41c5ff15fda04534b7e455fa88794f18&p=1',

'http://sou.zhaopin.com/jobs/searchresult.ashx?jl=%E5%8C%97%E4%BA%AC&kw=django&sm=0&sg=41c5ff15fda04534b7e455fa88794f18&p=2',

'http://sou.zhaopin.com/jobs/searchresult.ashx?jl=%E5%8C%97%E4%BA%AC&kw=django&sm=0&sg=41c5ff15fda04534b7e455fa88794f18&p=3',

'http://sou.zhaopin.com/jobs/searchresult.ashx?jl=%E5%8C%97%E4%BA%AC&kw=django&sm=0&sg=41c5ff15fda04534b7e455fa88794f18&p=4',

'http://sou.zhaopin.com/jobs/searchresult.ashx?jl=%E5%8C%97%E4%BA%AC&kw=django&sm=0&sg=41c5ff15fda04534b7e455fa88794f18&p=5',

]

# 定义采集数据的函数

def parse(self, response):

# 保存数据

filename = response.url.split("&")[-1] + ".html"

<p>

with open(filename, "w") as f:

f.write(response.body)</p>

  复制

  接下来进入爬虫根目录,执行如下命令运行爬虫程序

  scrapy crawl zlspider

  复制

  出现以下信息

  (python2_lib) D:\resp_work\py_1709\back_cursor\S-scrapy\myspider>scrapy crawl zlspider

# 程序开始启动~Scrapy 1.5.0 started

2018-01-15 18:09:15 [scrapy.utils.log] INFO: Scrapy 1.5.0 started (bot: myspider)

2018-01-15 18:09:15 [scrapy.utils.log] INFO: Versions: lxml 4.1.1.0, libxml2 2.9.5, cssselect 1.0.3, parsel 1.3.1, w3lib 1.18.0, Twisted

17.9.0, Python 2.7.13 (v2.7.13:a06454b1afa1, Dec 17 2016, 20:53:40) [MSC v.1500 64 bit (AMD64)], pyOpenSSL 17.5.0 (OpenSSL 1.1.0g 2 No

v 2017), cryptography 2.1.4, Platform Windows-10-10.0.16299

# 加载配置操作

2018-01-15 18:09:15 [scrapy.crawler] INFO: Overridden settings: {&#x27;NEWSPIDER_MODULE&#x27;: &#x27;myspider.spiders&#x27;, &#x27;SPIDER_MODULES&#x27;: [&#x27;myspider.sp

iders&#x27;], &#x27;ROBOTSTXT_OBEY&#x27;: True, &#x27;BOT_NAME&#x27;: &#x27;myspider&#x27;}

2018-01-15 18:09:15 [scrapy.middleware] INFO: Enabled extensions:

[&#x27;scrapy.extensions.logstats.LogStats&#x27;,

&#x27;scrapy.extensions.telnet.TelnetConsole&#x27;,

&#x27;scrapy.extensions.corestats.CoreStats&#x27;]

# 启用下载中间件内置功能

2018-01-15 18:09:16 [scrapy.middleware] INFO: Enabled downloader middlewares:

[&#x27;scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware&#x27;,

&#x27;scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware&#x27;,

&#x27;scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware&#x27;,

&#x27;scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware&#x27;,

&#x27;scrapy.downloadermiddlewares.useragent.UserAgentMiddleware&#x27;,

&#x27;scrapy.downloadermiddlewares.retry.RetryMiddleware&#x27;,

&#x27;scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware&#x27;,

&#x27;scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware&#x27;,

&#x27;scrapy.downloadermiddlewares.redirect.RedirectMiddleware&#x27;,

&#x27;scrapy.downloadermiddlewares.cookies.CookiesMiddleware&#x27;,

&#x27;scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware&#x27;,

&#x27;scrapy.downloadermiddlewares.stats.DownloaderStats&#x27;]

# 启用爬虫中间件内置功能

2018-01-15 18:09:16 [scrapy.middleware] INFO: Enabled spider middlewares:

[&#x27;scrapy.spidermiddlewares.httperror.HttpErrorMiddleware&#x27;,

&#x27;scrapy.spidermiddlewares.offsite.OffsiteMiddleware&#x27;,

&#x27;scrapy.spidermiddlewares.referer.RefererMiddleware&#x27;,

&#x27;scrapy.spidermiddlewares.urllength.UrlLengthMiddleware&#x27;,

&#x27;scrapy.spidermiddlewares.depth.DepthMiddleware&#x27;]

# 启用Pipeline内置功能

2018-01-15 18:09:16 [scrapy.middleware] INFO: Enabled item pipelines:

[]

# 爬虫程序启动

2018-01-15 18:09:16 [scrapy.core.engine] INFO: Spider opened

2018-01-15 18:09:16 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)

2018-01-15 18:09:16 [scrapy.extensions.telnet] DEBUG: Telnet console listening on 127.0.0.1:6023

2018-01-15 18:09:16 [scrapy.downloadermiddlewares.redirect] DEBUG: Redirecting (302)

# 开始采集数据

to fr

om

2018-01-15 18:09:16 [scrapy.core.engine] DEBUG: Crawled (200) (referer: None)

2018-01-15 18:09:16 [scrapy.core.engine] DEBUG: Crawled (200) (referer: None)

2018-01-15 18:09:17 [scrapy.core.engine] DEBUG: Crawled (200) (referer: None)

2018-01-15 18:09:17 [scrapy.core.engine] DEBUG: Crawled (200) (referer: None)

2018-01-15 18:09:17 [scrapy.core.engine] DEBUG: Crawled (200) (referer: None)

2018-01-15 18:09:17 [scrapy.core.engine] DEBUG: Crawled (200) (referer: None)

2018-01-15 18:09:17 [scrapy.core.engine] INFO: Closing spider (finished)

# 回显采集状态

2018-01-15 18:09:17 [scrapy.statscollectors] INFO: Dumping Scrapy stats:

{&#x27;downloader/request_bytes&#x27;: 2019,

&#x27;downloader/request_count&#x27;: 7,

&#x27;downloader/request_method_count/GET&#x27;: 7,

&#x27;downloader/response_bytes&#x27;: 241042,

&#x27;downloader/response_count&#x27;: 7,

&#x27;downloader/response_status_count/200&#x27;: 6,

&#x27;downloader/response_status_count/302&#x27;: 1,

&#x27;finish_reason&#x27;: &#x27;finished&#x27;,

&#x27;finish_time&#x27;: datetime.datetime(2018, 1, 15, 10, 9, 17, 674000),

&#x27;log_count/DEBUG&#x27;: 8,

&#x27;log_count/INFO&#x27;: 7,

&#x27;response_received_count&#x27;: 6,

&#x27;scheduler/dequeued&#x27;: 5,

&#x27;scheduler/dequeued/memory&#x27;: 5,

&#x27;scheduler/enqueued&#x27;: 5,

&#x27;scheduler/enqueued/memory&#x27;: 5,

&#x27;start_time&#x27;: datetime.datetime(2018, 1, 15, 10, 9, 16, 319000)}

2018-01-15 18:09:17 [scrapy.core.engine] INFO: Spider closed (finished)

  复制

  另外,在爬虫程序所在的目录中,我们还看到所有对应的收录start_urls中收录的url地址的网页都被爬虫采集定位到本地。

  然后,下一步就是按照指定的方式对数据进行过滤,并将数据封装在Item中以供后续处理。Scrapy 提供了各种选择器来轻松地从 response.data 中提取数据。官方的推荐也经常出现在项目中。选择器如下

  注意:CSS 与 XPath:您可以只使用 CSS 选择器从网页中提取数据。但是,XPath 提供了更强大的功能。它不仅指示数据所在的路径,还可以查看数据:例如,您可以选择:带有“下一页”文本的链接。因此,即使您已经知道如何使用 CSS 选择器,我们也建议您使用 XPath。

  

  接下来我们修改myspider/spiders.py/ZhilianSpider爬虫程序,通过xpath提取Item中需要的数据

  def parse(self, response):

# 定义保存数据的列表

items = []

for each in response.xpath("//div[@class=&#x27;zhaopin&#x27;]"):

# 将我们得到的数据封装到一个 `ZhaopinItem` 对象

item = ZhaopinItem()

#extract()方法返回的都是unicode字符串

job_name = each.xpath("p[1]/text()").extract()

salary = each.xpath("p[2]/text()").extract()

company = each.xpath("p[3]/text()").extract()

#xpath返回的是包含一个元素的列表

item[&#x27;job_name&#x27;] = job_name[0]

item[&#x27;salary&#x27;] = salary[0]

item[&#x27;company&#x27;] = company[0]

items.append(item)

# 直接返回最后的所有数据

return items

  复制

  可以随时使用以下命令将数据导出为所需的结果:

  # json格式,默认为Unicode编码

scrapy crawl zlspider -o job.json

# json lines格式,默认为Unicode编码

scrapy crawl zlspider -o job.jsonl

# csv 逗号表达式,可用Excel打开

scrapy crawl zlspider -o job.csv

# xml格式

scrapy crawl zlspider -o job.xml

  复制

  同时可以通过协程将数据直接交给管道进行后续的数据过滤、验证或数据存储操作

  from items import ZhaopinItem

..

def parse(self, response):

for each in response.xpath("//div[@class=&#x27;zhaopin&#x27;]"):

# 将我们得到的数据封装到一个 `ZhaopinItem` 对象

item = ZhaopinItem()

#extract()方法返回的都是unicode字符串

job_name = each.xpath("p[1]/text()").extract()

salary = each.xpath("p[2]/text()").extract()

company = each.xpath("p[3]/text()").extract()

#xpath返回的是包含一个元素的列表

item[&#x27;job_name&#x27;] = job_name[0]

item[&#x27;salary&#x27;] = salary[0]

item[&#x27;company&#x27;] = company[0]

items.append(item)

# yield数据给pipeline进行处理

yield item

  复制

  (4) pipelines 处理数据

  当数据被spider采集完成后,封装在Item对象中,通过yield数据传递给管道进行处理。在管道中,Item 对象的处理是根据定义的顺序执行的。每个Pipelines在python中都是一个类型,可以进行后续的数据过滤、验证、存储等操作

  在实际开发过程中,参考官方文档,在Item类型中默认定义了以下方法:

  如下:

  # coding:utf-8

class SomePipeline():

def __init__(self):

# 可选:主要进行程序中数据初始化操作使用

def open_spider(self, spider):

# 可选,当爬虫启动时调用

def process_item(self, item, spider):

# 必须,当爬虫程序yield item数据时调用

def close_spider(self, spider):

# 可选,当爬虫程序关闭时调用

  复制

  处理完成后,需要修改爬虫设置文件settings.py中的PIPELINES配置项启用Pipeline,通过0~1000之间的整数定义执行优先级【数值越小优先级越高】

  ITEM_PIPELINES = {

&#x27;myspider.pipelines.SomePipeline&#x27;: 200

}

  复制

  重新设计了我们的招聘爬虫的管道处理模块

  # coding:utf-8

class ZhaopinPipeline(object):

def process_item(self, item, spider):

# 这里可以执行item中数据的验证、存储等工作

print(item)

return item

  复制

  那么,请想一想,如何将数据 采集 存储到数据库中以便在管道中记录?

  解决方案:自定义字段和选项WordPress主题开发插件MyBox 2.4.8

  MyBox是一个自定义字段和选项WordPress主题开发插件,它提供了一个完整而强大的框架,用于创建美观,专业和灵活的MetaBox以及管理页面或主题选项。

  

  MyBox 框架插件提供了多种类型的字段供您使用,以便为您的项目(插件或主题)构建任何选项面板。

  MyBox 框架插件包括导入和导出选项的高级功能。构建元框和管理页面从未如此简单。

  导入/导出选项

  

  大量字段类型

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线