京东热卖手机信息抓取实战:运用 Scrapy 获取品牌、价格、参数等信息
京东热卖手机信息抓取实战:运用 Scrapy 获取品牌、价格、参数等信息
本教程将使用 Scrapy 框架抓取京东热卖手机信息,包括品牌、价格、评价数量、是否自营以及详细参数信息。并进行去重处理,最终将数据保存为 Excel 文件。
1. 环境准备
- Python 3.x
- Scrapy 框架
- Pandas 库
- Selenium 库
- BeautifulSoup 库
2. 代码实现
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from bs4 import BeautifulSoup
import pandas as pd
# 定义要抓取的三个品牌
brands = ['Apple', '华为', '小米']
# 设置浏览器
browser = webdriver.Chrome()
browser.maximize_window() # 窗口最大化
# 打开京东手机热销页面
url = 'https://list.jd.com/list.html?cat=9987,653,655'
browser.get(url)
# 点击筛选条件中的“自营”选项
self_support = browser.find_element_by_xpath('//div[@id="J_selector"]/div[3]/div[2]/div[1]/a')
ActionChains(browser).move_to_element(self_support).click().perform()
# 定义空列表,用于保存抓取的信息
phone_list = []
# 循环遍历每个品牌
for brand in brands:
# 输入品牌名称,进行搜索
search_input = browser.find_element_by_id('key')
search_input.clear()
search_input.send_keys(brand)
search_btn = browser.find_element_by_class_name('button')
search_btn.click()
# 等待页面加载完全
wait = WebDriverWait(browser, 10)
wait.until(EC.presence_of_element_located((By.ID, 'J_goodsList')))
# 解析页面源代码,获取手机信息
soup = BeautifulSoup(browser.page_source, 'html.parser')
phone_items = soup.find_all('li', class_='gl-item')
for item in phone_items:
name = item.find('div', class_='p-name').text.strip()
price = item.find('div', class_='p-price').find('i').text
eval_num = item.find('div', class_='p-commit').find('a').text.strip('条评价')
self_support = True if item.find('div', class_='p-icons').find('i', class_='goods-icons-self-support') else False
phone = {'品牌': brand, '名称': name, '价格': price, '评价数量': eval_num, '自营': self_support}
phone_list.append(phone)
# 关闭浏览器
browser.quit()
# 将抓取的信息转换为DataFrame格式,进行去重
df = pd.DataFrame(phone_list)
df.drop_duplicates(subset=['品牌', '名称'], inplace=True)
# 重新设置索引
df.reset_index(drop=True, inplace=True)
# 定义空列表,用于保存手机参数信息
params_list = []
# 循环遍历每个手机,获取详细参数信息
for i in range(len(df)):
# 打开手机详情页面
url = 'https:' + soup.select('li.gl-item div.p-name a')[i]['href']
browser = webdriver.Chrome()
browser.get(url)
# 等待页面加载完全
wait = WebDriverWait(browser, 10)
wait.until(EC.presence_of_element_located((By.ID, 'detail')))
# 解析页面源代码,获取手机参数信息
soup = BeautifulSoup(browser.page_source, 'html.parser')
params = soup.find('div', id='parameter2').find_all('li')
param_dict = {}
for param in params:
param_list = param.text.strip().split(':')
if len(param_list) == 2:
param_dict[param_list[0]] = param_list[1]
params_list.append(param_dict)
# 关闭浏览器
browser.quit()
# 将手机参数信息转换为DataFrame格式,与手机信息进行合并
params_df = pd.DataFrame(params_list)
result = pd.concat([df, params_df], axis=1)
# 将结果保存为excel文件
result.to_excel('phones.xlsx', index=False)
3. 运行结果
运行代码后,将在当前目录下生成一个名为 phones.xlsx 的 Excel 文件,包含所有抓取到的手机信息和详细参数。
4. 注意事项
- 京东网站的反爬措施比较强,需要使用 Selenium 模拟浏览器操作来获取网页源代码。
- 网页加载需要时间,需要加入等待时间,以保证网页完全加载后再进行解析。
- 由于网站页面结构可能发生变化,需要根据实际情况调整代码。
5. 总结
本教程介绍了如何使用 Scrapy 框架抓取京东热卖手机信息,并进行去重处理,最终将数据保存为 Excel 文件。通过学习本教程,您可以掌握基本的网页抓取技术,并将其应用于其他数据采集任务。
原文地址: https://www.cveoy.top/t/topic/ol7g 著作权归作者所有。请勿转载和采集!