Python网络数据抓取(6):Scrapy 实战

简介: Python网络数据抓取(6):Scrapy 实战

引言

它是一个功能强大的Python框架,用于以非常灵活的方式从任何网站提取数据。它使用 Xpath 来搜索和提取数据。它很轻量级,对于初学者来说很容易理解。

现在,为了了解 Scrapy 的工作原理,我们将使用这个框架来抓取 Amazon 数据。我们将抓取亚马逊的图书部分,更具体地说,我们将抓取过去 30 天内发布的书籍。

实战

我们将从创建一个文件夹并安装 Scrapy 开始。

mkdir scraper

pip install scrapy

现在,在开始编码之前,我们必须创建一个项目。只需在终端中输入以下命令即可。

scrapy startproject amazonscraper

此命令将在 scraper 文件夹内创建一个名为 amazonscraper 的项目文件夹。

上面的命令还在终端上返回一些消息,告诉您如何开始编写自己的抓取工具。我们将使用这两个命令。
让我们先进入这个 amazonscraper 文件夹。

cd amazonscraper
scrapy genspider amazon_spider amazon.com

这将为我们创建一个通用的spider,这样我们就不必通过进入spider文件夹来创建我们自己的spider,这将自动为我们创建它。然后我们为spider命名,然后输入目标网站的域名。

当您按 Enter 键时,您的文件夹中将出现一个名为 amazon_spider.py 的文件。当您打开该文件时,您会发现已自动创建了一个解析函数和一个 Amazonspider 类。

import scrapy

class AmazonSpiderSpider(scrapy.Spider):
 name = ‘amazon_spider’
 allowed_domains = [‘amazon.com’]
 start_urls = [‘http://amazon.com/']

def parse(self, response):
 pass

我们将删除 allowed_domains 变量,因为我们不需要它,同时我们将声明 start_urls 到我们的目标 URL。

//amazon_spider.py

import scrapy

class AmazonSpiderSpider(scrapy.Spider):
 name = ‘amazon_spider’
 allowed_domains = [‘amazon.com’]
 start_urls = [‘https://www.amazon.com/s?k=books&i=stripbooks-intl-ship&__mk_es_US=%C3%85M%C3%85%C5%BD%C3%95%C3%91&crid=11NL2VKJ00J&sprefix=bo%2Cstripbooks-intl-ship%2C443&ref=nb_sb_noss_2']

def parse(self, response):
 pass

在开始使用抓取工具之前,我们需要在 items.py 文件中创建一些项目,它们是临时容器。我们将从亚马逊页面上抓取标题、价格、作者和图像链接。

由于我们需要来自亚马逊的四件商品,因此我们将添加四个变量来存储值。

//items.py

import scrapy

class AmazonscraperItem(scrapy.Item):
 # define the fields for your item here like:
 # name = scrapy.Field()
 product_name = scrapy.Field()
 product_author = scrapy.Field()
 product_price = scrapy.Field()
 product_imagelink = scrapy.Field()
 pass

现在,我们将该文件导入到 amazon_spider.py 文件中。

//amazon_spider.py

from ..items import AmazonscraperItem

只需在文件顶部键入它即可。现在,在我们的 parse 方法中,我们将声明一个变量,它将成为 AmazonscraperItem 类的实例。

def parse(self, response):
 items = AmazonscraperItem()
 pass

我们现在准备从亚马逊上抓取我们的目标元素。我们将从抓取产品名称开始。我们将声明一个变量product_name,它将等于产品名称元素的CSS 选择器。

def parse(self, response):
 items = AmazonscraperItem()
 product_name= response.css()
 pass

在这里,我将使用 SelectorGadget 扩展来获取目标页面上的元素位置。

在右下角你可以看到我们的 CSS 选择器。我将从这里复制它,然后将其粘贴到我们的代码中。

def parse(self, response):
 items = AmazonscraperItem()
 product_name= response.css(.a-size-medium’).extract()
 pass

我使用 .extract() 函数来获取所有这些产品元素的 HTML 部分。同样,我们将使用相同的技术来提取产品价格、作者和图像链接。在为作者查找 CSS 选择器时,SelectorGadget 会选择其中的一些,而会让许多作者未被选中。因此,您还必须选择这些作者。

def parse(self, response):
 items = AmazonscraperItem()
 product_name= response.css(.a-size-medium’).extract()

product_author = response.css(.a-color-secondary .a-row .a-size-base+ .a-size-base , .a-color-secondary .a-size-base.s-link-style , .a-color-secondary .a-size-base.s-link-style font’).extract()
 pass

现在,我们也找到价格的 CSS 选择器。

def parse(self, response):
 items = AmazonscraperItem()
 product_name= response.css(.a-size-medium’).extract()

product_author = response.css(.a-color-secondary .a-row .a-size-base+ .a-size-base , .a-color-secondary .a-size-base.s-link-style , .a-color-secondary .a-size-base.s-link-style font’).extract()

product_price = response.css(.s-price-instructions-style .a-price-fraction , .s-price-instructions-style .a-price-whole’).extract()

 pass

最后,现在我们将找到图像的 CSS 选择器。

.s-image 是我们图像的 CSS 选择器。

def parse(self, response):
 items = AmazonscraperItem()
 product_name= response.css(.a-size-medium’).extract()

product_author = response.css(.a-color-secondary .a-row .a-size-base+ .a-size-base , .a-color-secondary .a-size-base.s-link-style , .a-color-secondary .a-size-base.s-link-style font’).extract()

product_price = response.css(.s-price-instructions-style .a-price-fraction , .s-price-instructions-style .a-price-whole’).extract()

 product_imagelink = response.css(.s-image’).extract()

现在,正如我之前所说,这只会为我们提供 HTML 代码,我们需要从中提取名称。因此,为此,我们将使用 Scrapy 的文本功能。这将确保不会提取整个标签,并且仅提取该标签中的文本。

product_name= response.css(.a-size-medium::text’).extract()

但是因为我们为 CSS 选择器使用了多个类,所以我们无法在末尾添加此文本。我们必须对product_price 和product_author 使用.css() 函数。

product_author = response.css(.a-color-secondary .a-row .a-size-base+ .a-size-base , .a-color-secondary .a-size-base.s-link-style , .a-color-secondary .a-size-base.s-link-style font’).css(::text’).extract()

product_price = response.css(.s-price-instructions-style .a-price-fraction , .s-price-instructions-style .a-price-whole’).css(::text’).extract()

现在,product_imagelink 只是选择图像,因此我们不会在其上使用 .css() 函数。我们的图像存储在 src 标签内,我们需要它的值。

我们将使用Scrapy的attr功能。

product_imagelink = response.css(.s-image::attr(src)).extract()

我们已经成功提取了所有值。现在,我们将它们存储在各自的临时物品容器中,这就是我们的做法。

items[‘product_name’] = product_name

这个product_name实际上是我们在items.py文件中声明的变量。我们将对所有其他目标元素执行此操作。

items[‘product_name’] = product_name
 items[‘product_author’] = product_author
 items[‘product_price’] = product_price
 items[‘product_imagelink’] = product_imagelink

现在,我们只需要生成这些项目,这将完成我们的代码。我们的代码一开始可能不会,但让我们看看我们得到了什么。

yield items

现在,要运行我们的代码,请在终端上运行以下命令。

scrapy crawl amazon_spider

正如你所看到的,我们得到了一个空数组。这是由于亚马逊的反机器人机制所致。为了克服这个问题,我们将在 settings.py 文件中设置一个用户代理。

USER_AGENT = ‘Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0

现在,让我们再试一次。

我们得到了结果。但和往常一样,这不会持续多久,因为亚马逊的反机器人技术将会启动,你的抓取工具将会停止。

Scrapy的功能还不止于此!

  • 您可以通过更改 CONCURRENT_REQUESTS 的值在 settings.py 文件中设置并行请求数。这将帮助您检查 API 可以处理多少负载。
  • 它比 Python 提供的大多数 HTTP 库都要快。
相关文章
|
23天前
|
机器学习/深度学习 人工智能 算法
猫狗宠物识别系统Python+TensorFlow+人工智能+深度学习+卷积网络算法
宠物识别系统使用Python和TensorFlow搭建卷积神经网络,基于37种常见猫狗数据集训练高精度模型,并保存为h5格式。通过Django框架搭建Web平台,用户上传宠物图片即可识别其名称,提供便捷的宠物识别服务。
234 55
|
1月前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。
|
1月前
|
机器学习/深度学习 人工智能 算法
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
宠物识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了37种常见的猫狗宠物种类数据集【'阿比西尼亚猫(Abyssinian)', '孟加拉猫(Bengal)', '暹罗猫(Birman)', '孟买猫(Bombay)', '英国短毛猫(British Shorthair)', '埃及猫(Egyptian Mau)', '缅因猫(Maine Coon)', '波斯猫(Persian)', '布偶猫(Ragdoll)', '俄罗斯蓝猫(Russian Blue)', '暹罗猫(Siamese)', '斯芬克斯猫(Sphynx)', '美国斗牛犬
168 29
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
|
1月前
|
小程序 开发者 Python
探索Python编程:从基础到实战
本文将引导你走进Python编程的世界,从基础语法开始,逐步深入到实战项目。我们将一起探讨如何在编程中发挥创意,解决问题,并分享一些实用的技巧和心得。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你提供有价值的参考。让我们一起开启Python编程的探索之旅吧!
48 10
|
1月前
|
存储 安全 网络安全
网络安全的盾与剑:漏洞防御与加密技术的实战应用
在数字化浪潮中,网络安全成为保护信息资产的重中之重。本文将深入探讨网络安全的两个关键领域——安全漏洞的防御策略和加密技术的应用,通过具体案例分析常见的安全威胁,并提供实用的防护措施。同时,我们将展示如何利用Python编程语言实现简单的加密算法,增强读者的安全意识和技术能力。文章旨在为非专业读者提供一扇了解网络安全复杂世界的窗口,以及为专业人士提供可立即投入使用的技术参考。
|
1月前
|
存储 缓存 监控
Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
本文介绍了Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
113 7
|
2月前
|
网络安全 Python
Python网络编程小示例:生成CIDR表示的IP地址范围
本文介绍了如何使用Python生成CIDR表示的IP地址范围,通过解析CIDR字符串,将其转换为二进制形式,应用子网掩码,最终生成该CIDR块内所有可用的IP地址列表。示例代码利用了Python的`ipaddress`模块,展示了从指定CIDR表达式中提取所有IP地址的过程。
59 6
|
2月前
|
机器学习/深度学习 自然语言处理 语音技术
Python在深度学习领域的应用,重点讲解了神经网络的基础概念、基本结构、训练过程及优化技巧
本文介绍了Python在深度学习领域的应用,重点讲解了神经网络的基础概念、基本结构、训练过程及优化技巧,并通过TensorFlow和PyTorch等库展示了实现神经网络的具体示例,涵盖图像识别、语音识别等多个应用场景。
76 8
|
2月前
|
算法 Unix 数据库
Python编程入门:从基础到实战
本篇文章将带你进入Python编程的奇妙世界。我们将从最基础的概念开始,逐步深入,最后通过一个实际的项目案例,让你真正体验到Python编程的乐趣和实用性。无论你是编程新手,还是有一定基础的开发者,这篇文章都将为你提供有价值的信息和知识。让我们一起探索Python的世界吧!
|
2月前
|
数据采集 存储 JSON
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第27天】本文介绍了Python网络爬虫Scrapy框架的实战应用与技巧。首先讲解了如何创建Scrapy项目、定义爬虫、处理JSON响应、设置User-Agent和代理,以及存储爬取的数据。通过具体示例,帮助读者掌握Scrapy的核心功能和使用方法,提升数据采集效率。
123 6