Scrapy 爬虫实战:爬取京东商品信息并进行数据分析
Scrapy 是一个用于爬取网站数据的 Python 框架,它可以帮助我们快速地抓取海量的信息,并进行数据分析和处理。在本篇文章中,我们将使用 Scrapy 爬虫实战,以京东商品信息为例,来演示如何进行数据抓取和分析。
- Scrapy 爬虫介绍
Scrapy 是一款基于 Python 的开源网络爬虫框架,具有高效、快速、灵活等特点。它提供了一系列强大的工具,包括多线程异步处理、数据导出、数据分析、网页解析等等。Scrapy 爬虫主要包括以下组件:
- Scrapy Engine: 引擎是整个爬虫的核心,负责调度各个组件协同工作。
- Scheduler: 负责按照一定的策略对待爬取的 URL 进行调度处理。
- Downloader: 负责下载网页内容,并返回给引擎进行解析。
- Spiders: 负责通过定义 XPath 规则或正则表达式从网页中抓取数据。
- Item Pipeline: 负责对抓取到的数据进行后续处理,如数据的清洗、存储等。
- Middlewares: 负责处理爬虫的请求和响应,如请求重试、代理管理等操作。
- 爬取京东商品信息
在本示例中,我们将使用 Scrapy 爬虫框架,以京东商城为例,来抓取商品信息。整个过程分为以下几个步骤:
- 安装 Scrapy 和相关库
- 创建 Scrapy 项目
- 编写 Scrapy 爬虫
- 数据处理和存储
2.1 安装 Scrapy 和相关库
在开始之前,我们需要先安装 Scrapy 库和其他相关的库,如 pandas 和 numpy,以便后续进行数据分析和处理。可以使用以下命令安装:
pip install Scrapy pandas numpy
2.2 创建 Scrapy 项目
在安装完成 Scrapy 和相关库之后,我们需要创建一个 Scrapy 项目。可以使用以下命令创建:
scrapy startproject jdspider
执行该命令后,会自动生成 jdspider 目录,该目录下包含了 Scrapy 项目的基本结构。
2.3 编写 Scrapy 爬虫
在创建了 Scrapy 项目之后,我们需要编写 Scrapy 爬虫代码。这里以爬取 “京东手机” 为例(可根据自己的需要修改关键词),代码如下:
# -*- coding: utf-8 -*- import scrapy import json class JdspiderSpider(scrapy.Spider): name = 'jdspider' allowed_domains = ['search.jd.com', 'item.jd.com'] start_urls = ['https://search.jd.com/Search?keyword=京东手机&enc=utf-8'] def parse(self, response): # 解析商品列表页面,获取商品详情页 URL for item in response.xpath('//*[@id="J_goodsList"]/ul/li'): url = item.xpath('div[@class="p-img"]/a/@href').extract_first() if url: yield scrapy.Request(url='https:' + url, callback=self.parse_item_page) # 解析下一页链接,继续爬取 next_page = response.xpath('//a[@class="pn-next"]/@href') if next_page: yield scrapy.Request(url='https://search.jd.com' + next_page.extract_first(), callback=self.parse) def parse_item_page(self, response): # 解析商品详情页,获取相关信息 item = {} item['product_id'] = response.url.split('/')[-1].split('.')[0] item['name'] = response.xpath('//div[@class="sku-name"]/text()').extract_first() item['brand'] = response.xpath('//a[@clstag="shangpin|keycount|product|mbNav-1"]/text()').extract_first() item['price'] = response.xpath('//div[@class="pri-box"]/span[@class="price J-p-{}"]/text()' '|//div[@class="dd"]/div[@class="p-price"]/span[@class="price"]/text()').extract_first() item['comment_num'] = response.xpath('//div[@id="comment-count"]/a/text()' '|//div[@class="comment-count clearfix"]/a/text()').extract_first() sku_url = 'https://p.3.cn/prices/mgets?skuIds=J_{}'.format(item['product_id']) yield scrapy.Request(url=sku_url, callback=self.parse_sku, meta={'item': item}) def parse_sku(self, response): # 解析 SKU 价格信息 item = response.meta['item'] try: sku_dict = json.loads(response.body) item['sku_price'] = sku_dict[0]['p'] except Exception as e: item['sku_price'] = None yield item
上面的代码中,我们定义了一个名为 JdspiderSpider
的爬虫,并设置了初始链接和需要爬取的站点。然后,利用 parse()
方法解析京东搜索页面的商品列表,获取每个商品的详情页 URL,并递归爬取下一页。接下来,利用 parse_item_page()
方法解析每个商品详情页,并获取所需的信息,如商品名、品牌、价格、评论数等。最后,利用 parse_sku()
方法解析商品 SKU 价格信息,并将所有信息保存在 item
数据结构中,供后续数据处理和存储。
2.4 数据处理和存储
在完成数据抓取之后,我们需要对数据进行处理和存储。这里,我们选择使用 pandas 和 numpy 库对数据进行处理,并将数据存储在 CSV 文件中。代码如下:
# -*- coding: utf-8 -*- import pandas as pd import numpy as np df = pd.read_csv('items.csv') df.drop_duplicates('product_id', inplace=True) df = df.dropna(subset=['name', 'brand', 'price']) df['price'] = df['price'].apply(lambda x: float(x) if x else np.nan) df['price'] = df['price'].fillna(df.groupby('brand')['price'].transform('mean')) df.to_csv('jd_mobile.csv', index=False, encoding='utf-8-sig') print('Data saved to jd_mobile.csv')
上面的代码中,我们先使用 pandas 库读取 Scrapy 爬虫爬取的数据文件 items.csv
,并进行数据清洗和处理。具体来说,我们首先去除商品详情页 URL 相同的条目,然后去除数据不完整的条目(即缺失商品名、品牌、价格等信息的条目),最后对价格属性进行处理,其中缺失值使用所属品牌的平均价格进行填充。最后将处理后的数据存储在 CSV 文件中。
- 总结
本文从 Scrapy 爬虫介绍、京东商品信息爬取到数据处理和存储,演示了一个完整的 Scrapy 爬虫实战。在实际应用中,在数据处理和存储过程中,还可以使用图表和统计分析等方法,帮助我们更加直观和深入地了解商品信息的特征和规律。
相关文章