加入收藏 | 设为首页 |

发烧-「Python爬虫教程」运用Scrapy for Python制造Web爬虫

海外新闻 时间: 浏览:475 次

Scrapy概述

网络抓取已成为从网络中提取信息以进行决议计划和剖析的有用办法。它已成为数据科学东西包的重要组成部分。数据科学家应该知道怎么从网页搜集数据并以不同的格局存储数据以供进一步剖析。

您能够抓取您在互联网上看到的任何网页以获取信息,而且能够提取网页上可见的任何内容[ 2 ]。每个网页都有自己的结构和Web元素,因而您需求依据提取的网页编写Web爬虫/蜘蛛。

Scrapy供给了一个强壮的结构,用于提取数据,处理数据然后保存

Scrapy运用spiders,它是自包括的爬虫,给出一组指令[ 1 ]。在Scrapy中,经过答应开发人员重用其代码,能够更轻松地构建和扩展大型爬网项目。

Scrapy与 BeautifulSoup

在本节中,您将概述最常用的WebS抓取东西之一BeautifulSoup及其与Scrapy的比较。

Scrapy是一个用于Web抓取的Python结构,它为开发人员供给了一个完好的包,而不用忧虑保护代码。

美丽的汤也广泛用于网刮。它是一个Python包,用于解析HTML和XML文档并从中提取数据。它适用于Pytho发烧-「Python爬虫教程」运用Scrapy for Python制造Web爬虫n 2.6+和Python 3。

以下是它们之间的一些差异:

信息:同步意味着您有必要等候作业完结才干开端新作业而异步意味着您能够在上一个作业完结之前移动到另一个作业

Scrapy装置

装置了Python 3.0(及今后版别),假如您运用的是anaconda,则能够运用conda装置scrapy。在anaconda提示符下写下以下指令:

conda install -c conda-forge scrapy

或许,您能够运用Python Package Installer pip。这适用于Linux,Mac和Windows:

pip install scrapy

Scrapy Shell

Scrapy还供给了一个名为Scrapy Shell的Web匍匐shell ,开发人员能够运用它来测验他们对站点行为的假定。让咱们在AliExpress电子商务网站上获取平板电脑的网页。您能够运用Scrapy shell检查网页回来的组件以及怎么将它们用于您的要求。

翻开指令行并编写以下指令:

scrapy shell

假如您运用的是anaconda,您也能够在anaconda提示符下编写上述指令。您在指令行或anaconda提示符下的输出将是这样的:

您有必要运用fetchScrapy shell中的指令在网页上运转爬网程序。爬虫或蜘蛛经过网页下载其文本和元数据。

fetch(https://www.aliexpress.com/category/200216607/tablets.html)

留意:一直将URL括在引号中,单引号和双引号都有用

输出如下:

爬虫回来一个呼应,能够运用view(response)shell上的指令检查该呼应

view(response)

该网页将在默许阅览器中翻开。

您能够在Scrapy shell中运用以下指令检查原始HTML脚本:

print(response.text)

您将看到生成网页的脚本。当您左键单击网页上的任何空白区域并单击检查源检查页面源时,内容相同。由于,您只需求整个脚本中的相关信息,运用阅览器开发人员东西,您将检查所需的元素。咱们来看看以下内容:

  • 平板电脑称号
  • 平板电脑价格
  • 订单数量
  • 商铺称号

右键单击所需的元素,然后单击inspect如下所示:

阅览器的开发人员东西将经过网络抓取协助您。您能够看到它是带有class 产品的符号,文本包括产品的称号:

运用CSS挑选器进行提取

您能够运用元素特点或相似的css挑选器来提取它。在Scrapy shell中写下以下内容以提取产品称号:

response.css(".product::text").extract_first()

输出将是:

extract_first()提取满意css挑选器的第一个元素。假如要提取一切产品称号,请运用extract():

response.css(".product::text").extract()

以下代码将提取产品的价格规模:

response.css(".value::text").extract()

相同,您能够测验运用多个订单和商铺的称号。

运用XPath进行提取

XPath是一种用于挑选XML文档中节点的查询言语[ 7 ]。您能够运用XPath阅览XML文档。在暗地,Scrapy运用Xp范迪塞尔ath导航到HTML文档项。您在上面运用的CSS挑选器也转换为XPath,但在许多情况下,CSS十分易于运用。可是你应该知道Scrapy中的XPath是怎么作业的。

转到Scrapy Shell并fetch(https://www.aliexpress.com/category/200216607/tablets.html/)以与曾经相同的办法编写。试试下面的代码片段[ 3 ]:

response.xpath('/html').extract()

这将显现标签下的一切代码。/表明节点的直接子节点。假如你想取得

标签下的html标签,你会写[ 3 ]:

response.xpath('/html//div').extract()

关于XPath,您有必要学会了解怎么运用/和//了解怎么阅览子节点和子孙节点。这是一个有用的XPath节点教程和一些测验的比如。

假如您想取得一切

标签,能够经过向下钻取而不运用/html[ 3 ]来完结:

response.xpath("//div").extract()

您能够运用特点及其值进一步过滤从您开端的节点并抵达所需节点。下面是运用类及其值的语法。

response.xpath("//div[@class='quote']/span[@class='text']").extract()
response.xpath("//div[@class='quote']/span[@class='text']/text()").extract()

运用text()提取节点内的一切文本

请考虑以下HTML代码:

您期望获取符号内的文本,这是

haing类的子节点,site-notice-container container您能够按如下办法履行:

response.xpath('/发烧-「Python爬虫教程」运用Scrapy for Python制造Web爬虫/div[@class="site-notice-container container"]/a[@class="notice-close"]/text()').extract()

创立Scrapy项目和Custom Spider

Web抓取可用于创立可用于比较数据的聚合器。例如,您想要购买平板电脑,而且想要将产品和价格进行比较,您能够抓取所需的页面并存储在Excel文件中。在这儿,您将捉住aliexpress.com获取平板电脑信息。

现在,您将为同一页面创立自界说蜘蛛。首要,您需求创立一个Scrapy项目,您的代码和成果将存储在该项目中。在指令行或anaconda提示符下写下以下指令。

scrapy startproject aliexpress

这将在您的默许python或anaconda装置中创立一个躲藏文件夹。aliexpress将是文件夹的称号。你能够给任何姓名。您能够直接经过资源管理器检查文件夹内容。以下是文件夹的结构:

文件夹意图scrapy.cfg布置配置文件全球速卖通/Project的Python模块,您将从此处导入代码__init.py__初始化文件items.py项目项目文件pipelines.py项目管道文件settings.py项目设置文件蜘蛛/您将在今后放置蜘蛛的目录__init.py__初始化文件

创立项目后,您将更改为新创立的目录并编写以下指令:

[scrapy genspider aliexpress_tablets](https://www.aliexpress.com/category/200216607/tablets.html)

这将创立一个aliexpress_tablets.py在spiders目录中命名的模板文件,如上所述。该文件中的代码如下:

import scrapy
class AliexpressTabletsSpider(scrapy.Spider):
name = 'aliexpress_tablets'
allowed_domains = ['aliexpress.com']
start_urls = ['https://www.aliexpress.com/category/200216607/tablets.html']
def parse(self, response):
pass

在上面的代码中,您能够看到name,allowed_domains和s start_urls和一个parse函数。

  • name: Name是蜘蛛的称号。正确的称号将协助您盯梢您所做的一切蜘蛛。称号有必要是仅有的,由于它将在运用时用于运转蜘蛛scrapy crawl name_of_spider。
  • allowed_domains(可选):可选的python列表,包括答应被爬网的域。不会抓取不在此列表中的网址恳求。这应该只包括网站的域名(例如:aliexpress.com),而不是start_urls中指定的整个URL,不然您将收到正告。
  • start_urls:恳求说到的URL。当没有指定特定URL时,蜘蛛将开端抓取的URL列表[ 4 ]。因而,下载的第一页将是此处列出的页面。后续恳求将从开始URL [ 4 ]中包括的数据接连生成。
  • parse(self,response):只需成功遍历URL,就会调用此函数。它也称为回调函数。response在匍匐过程中回来的(在Scrapy shell中运用)在此函数中传递,并在其间编写提替代码!

信息:您能够parse()在Scrapy spider的函数内部运用BeautifulSoup 来解析html文档。

留意:您能够运用scrapy shell部分中评论的css挑选器提取数据,response.css()但也能够运用答应拜访子元素的XPath(XML)。您将response.xpath()在pass()函数中修正的代码中看到示例。

您将对aliexpress_tablet.py文件进行更改。我在其间增加了另一个网址start_urls。您能够将提取逻辑增加到pass()函数中,如下所示:

# -*- coding: utf-8 -*-
import scrapy
class AliexpressTabletsSpider(scrapy.Spider):
name = 'aliexpress_tablets'
allowed_domains = ['aliexpress.com']
start_urls = ['https://www.aliexpress.com/category/200216607/tablets.html',
'https://www.aliexpress.com/category/200216607/tablets/2.html?site=glo&g=y&tag=']
def parse(self, response):
print("procesing:"+response.url)
#Extract data using css selectors
product_name=response.css('.product::text').extract()
price_range=response.css('.value::text').extract()
#Extract data using xpath
orders=response.xpath("//em[@title='Total Orders']/text()").extract()
company_name=response.xpath("//a[@class='store $p4pLog']/text()").extract()
row_data=zip(product_name,price_range,orders,company_name)
#Making extracted data row wise
for item in row_data:
#create a dictionary to store the scraped info
scraped_info = {
#key:value
'page':response.url,
'product_name' : item[0], #item[0] means product in the list and so on, index tells what value to assign
'price_range' : item[1],
'orders' : item[2],
'company_name' : item[3],
}
#yield or give the scraped info to scrapy
yield scraped_info

信息:zip()获取n个可迭代并回来元组列表。运用来自每个迭代的第i个元素创立元组的元素。[ 8 ]

yield不管何时界说生成器函数,都会运用该关键字。生成器函数就像一般函数相同,除了它运用yield关键字而不是return。yield只需调用者函数需求一个值,而且包括的​​函数yield将坚持其本地状况并在向调用函数发生值后持续履行它中止的方位,就会运用该关键字。这儿yield给Scrapy生成的字典,它将处理并保存它!

现在你能够运转蜘蛛了:

scrapy crawl aliexpress_tablets

你会在指令行看到一个长输出,如下所示:

导出数据

您需求将数据显现为CSV或JSON,以便您能够进一步运用数据进行剖析。本教程的这一部分将辅导您怎么为此数据保存CSV和JSON文件。

要保存CSV文件,请settings.py从项目目录中翻开并增加以下行:

FEED_FORMAT="csv"
FEED_URI="aliexpress.csv"

保存后settings.py,从头运转scrapy crawl aliexpress_tablets项目目录。

CSV文件如下所示:

留意:每次运转蜘蛛时,它都会附加文件。

  • FEED_FORMAT [ 5 ]:设置要存储数据的格局。支撑的格局是:
 + JSON
+ CSV
+ JSON Lines
+ XML
  • FEED_URI [ 5 ]:这给出了文件的方位。您也能够将文件存储在本地文件存储或FTP上。

Scrapy的Feed Export还能够将时刻戳和spider的称号增加到文件名中,或许您能够运用这些来标识要存储的目录。

  • %(time)s:在创立Feed时被时刻戳替换[ 5 ]
  • %(name)s:被蜘蛛称号替代[ 5 ]

例如:

  • 运发烧-「Python爬虫教程」运用Scrapy for Python制造Web爬虫用每个蜘蛛一个目录存储在FTP中[ 5 ]:

ftp://user:password@ftp.example.com/scraping/feeds/%(name)s/%(time)s.json

您所做的Feed更改settings.py将适用于项目中的一切蜘蛛。您还能够为将掩盖settings.py文件中的设置的特定蜘蛛设置自界说设置。

# -*- coding: utf-8 -*-
import scrapy
class AliexpressTabletsSpider(scrapy.Spider):
name = 'aliexpress_tablets'
allowed_domains = ['aliexpress.com']
start_urls = ['https://www.aliexpress.com/category/200216607/tablets.html',
'https://www.aliexpress.com/category/200216607/tablets/2.html?site=glo&g=y&tag=']
custom_settings={ 'FEED_URI': "aliexpress_%(time)s.json",
'FEED_FORMAT': 'json'}
def parse(self, response):
print("procesing:"+response.url)
#Extract data using css selectors
product_name=response.css('.product::text').extract()
price_range=response.css('.value::text').extract()
#Extract data using xpath
orders=response.xpath("//em[@title='Total Orders']/text()").extract()
company_name=response.xpath("//a[@class='store $p4pLog']/text()").extract()
row_data=zip(product_name,price_range,orders,company_name)
#Making extracted data row wise
for item in row_data:
#create a dictionary to store the scraped info
scraped_info = {
#key:value
'page':response.url,
'product_name' : item[0], #item[0] means product in the list and so on, index tells what value to assign
'price_range' : item[1],
'orders' : item[2],
'company_name' : item[3],
}
#yield or give the scraped info to Scrapy
yield scraped_info

response.url回来生成呼应的页面的URL。运用爬虫后,scrapy crawl aliexpress_tablets您能够检查json文件:

以下链接

你必定留意到,有两个链接start_urls。第二个链接是相同平板电脑查找成果的第2页。增加一切链接将变得不切实际。爬虫应该能够在一切页面中自行匍匐,而且只能在中说到开始点start_urls。

假如页面包括后续页面,您将在页面结尾看到一个导航器,答应来回移动页面。在本教程中完结的情况下,您将看到如下所示:

以下是您将看到的代码:

正如您所看到的那样,有一个带有类.ui-pagination-active类的符号,它是您当时地点的页面,而且在其下面是一切带有指向下一页的链接的符号。每次您有必要在此符号后获取符号。这儿有一点CSS!在这儿,您有必要获取兄弟节点而不是子节点,因而您有必要创立一个css挑选器,通知爬虫找到符号为class的符号.ui-pagination-active。

记住!每个网页都有自己的结构。你将不得不研究一下怎么取得所需元素的结构。一直在Scrapy Shell上测验运用response.css(SELECTOR),然后再在代码中编写它们。

修正aliexpress_tablets.py如下:


import scrapy
class AliexpressTabletsSpider(scrapy.Spider):
name = 'aliexpress_tablets'
allowed_domains = ['aliexpress.com']
start_urls = ['https://www.aliexpress.com/category/200216607/tablets.html']
custom_settings={ 'FEED_URI': "aliexpress_%(time)s.csv",
'FEED_FORMAT': 'csv'}
def parse(self, response):
print("procesing:"+response.url)
#Extract data using css selectors
product_name=response.css('.product::text').extract()
price_range=response.css('.value::text').extract()
#Extract data using xpath
orders=response.xpath("//em[@title='Total Orders']/text()").extract()
company_name=response.xpath("//a[@class='store $p4pLog']/text()").extract()
row_data=zip(product_name,price_range,orders,company_name)
#Making extracted data row wise
for item in row_data:
#create a dictionary to store the scraped info
scraped_info = {
#key:value
'page':response.url,
'product_name' : item[0], #item[0] means product in the list and so on, index tells what value to assign
'price_range' : item[1],
'orders' : item[2],
'company_name' : item[3],
}
#yield or give the scraped info to scrapy
yield scraped_info
NEXT_PAGE_SELECTOR = '.ui-pagination-active + a::attr(href)'
next_page = response.css(NEXT_PAGE_SELECTOR).extract_first()
if next_page:
yield scrapy.Request(
response.urljoin(next_page),
callback=self.par发烧-「Python爬虫教程」运用Scrapy for Python制造Web爬虫se)

在上面的代码中:

在这儿你或许想坐下来享用你的蜘蛛刮一切页面。上面的蜘蛛将从一切后续页面中提取。这将是一个很大的刮!但你的蜘蛛会做到的!下面你能够看到文件的巨细已达到1.1MB。

Scrapy为你做到了!

在本教程中,您现已了解了Scrapy,它与BeautifulSoup,Scrapy Shell的比较以及怎么在Scrapy中编写自己的蜘蛛。Scrapy为您处理一切深重的编码作业,从创立项目文件和文件夹到处理重复的URL,它能够协助您在几分钟内取得大功率的Web抓取,并为您供给能够在其他程序中进一步输入的一切常见数据格局的支撑。本教程肯定会协助您了解Scrapy及其结构以及您能够运用它做些什么。要成为Scrapy的高手,您需求完结它有必要供给的一切功用,但本教程使您能够以有用的办法抓取网页组。

如需进一步阅览,您能够参阅官方Scrapy文档。

参阅