Scrapy 是一个用于在 Python 中创建网络爬虫的强大框架。它提供了内置的链接跟踪和网页信息提取功能。您需要创建一个新的 Scrapy 项目和一个蜘蛛(spider),以定义爬虫的行为。
在开始爬取亚马逊等网站之前,务必检查该网站的 robots.txt 文件,以确认哪些 URL 路径被允许访问。当 ROBOTSTXT_OBEY 设置为 true 时(这是使用 Scrapy 命令 `startproject` 创建项目的默认值),Scrapy 会自动读取该文件并遵循其规则。
要创建一个新的 Scrapy 项目,您需要运行以下命令:
$ scrapy startproject amazon_crawler
该命令将生成一个具有以下结构的项目:
amazon_crawler/
├── scrapy.cfg
└── amazon_crawler
├── __init__.py
├── items.py
├── middlewares.py
├── pipelines.py
├── settings.py
└── spiders
├── __init__.py
要创建蜘蛛,请使用 Scrapy CLI 中的 `genspider` 命令。该命令的定义如下:
$ scrapy genspider [options] <name> <domain>
要为该爬虫生成蜘蛛,我们可以运行:
$ cd amazon_crawler
$ scrapy genspider baby_products amazon.com
这将在名为 `spiders` 的文件夹内生成一个名为 `baby_products.py` 的文件,并生成以下代码:
import scrapy
class BabyProductsSpider(scrapy.Spider):
name = 'wikipedia'
allowed_domains = ['en.wikipedia.com']
start_urls = ['http://en.wikipedia.com/']
def parse(self, response):
pass
Scrapy 还提供了多种预构建的蜘蛛类,例如 CrawlSpider、XMLFeedSpider、CSVFeedSpider 和 SitemapSpider。CrawlSpider 类基于基础 Spider 类构建,它包含一个额外的 "rules" 属性,用于定义如何在网站中导航。每条规则都会使用 LinkExtractor 来确定应从每个页面中提取哪些链接。
针对我们的用例,应让 Spider 类继承自 CrawlSpider。我们还需要创建一个 LinkExtractor 规则,指示爬虫仅从亚马逊的分页中提取链接。请记住,我们的目标是收集亚马逊上所有婴儿产品的数据,因此我们并不希望追踪页面上找到的所有链接。
接着,我们需要在类中再创建两个方法:`parse_item` 和 `parse_product`。`parse_item` 将作为回调函数传递给我们的 LinkExtractor 规则,并在提取每个链接时被调用。`parse_product` 将解析每个产品……¯\_(ツ)_/¯
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
from bs4 import BeautifulSoup
class BabyProductsSpider(CrawlSpider):
name = 'baby_products'
allowed_domains = ['amazon.com']
start_urls = ['https://amazon.com/s?k=baby+products']
rules = (
Rule(
LinkExtractor(
restrict_css='.s-pagination-strip'
),
callback='parse_item',
follow=True),
)
def parse_item(self, response):
soup = BeautifulSoup(response.text, 'html.parser')
products = soup.select('div[data-component-type="s-search-result"]')
data = []
for product in products:
parsed_product = self.parse_product(product)
if (parsed_product != 'error'):
data.append(parsed_product)
return {
'url': response.url,
'data': data
}
def parse_product(self, product):
try:
link = product.select_one('a.a-text-normal')
price = product.select_one('span.a-price > span.a-offscreen').text
return {
'product_url': link['href'],
'name': link.text,
'price': price
}
except:
return 'error'
要启动爬虫,可以运行:
$ scrapy crawl baby_products
控制台将显示大量日志(可通过 `--logfile [log_file_name]` 指定日志文件)。
我以亚马逊搜索为例,演示了在 Python 中创建网络爬虫的基础知识。不过,该爬虫发现的可用链接不多,且并未针对特定数据用例进行优化。如果您希望从亚马逊搜索中提取特定数据,可以考虑使用我们的亚马逊商品数据 API。我们为亚马逊搜索、商品和分类页面创建了自定义解析器,它返回的 JSON 格式数据可直接用于您的应用程序。