江东的笔记

Be overcome difficulties is victory

0%

爬虫动态爬取京东商品的数据

根据xpath进行定位分析,提取信息、翻页等操作

导入包

1
2
3
4
5
6
7
from time import sleep

from selenium import webdriver
import pandas as pd
from urllib.parse import quote
import re
from datetime import datetime

对DataFrame处理

1
2
pd.set_option('display.max_columns', None)
pd.set_option('display.width', 150)

评论处理

如果含有“万”,则进行分割处理,将评论转化为int类型

1
2
3
4
5
6
def com_count(text):
if '万' in text:
num = float(text.split('万')[0])
return int(num * 10000)
else:
return int(re.match('\d+', text).group())

浏览器初始化

1
2
driver = webdriver.Chrome()  # 打开浏览器
driver.maximize_window() # 最大化窗口

查询的网页

1
2
3
4
key = '红酒'  # 设置搜索商品关键词
url = 'https://search.jd.com/Search?keyword=' + quote(key) + '&enc=utf-8' # 构造url
driver.get(url) # 打开url
driver.implicitly_wait(3) # 等待

爬取过程

  分析过程如下:根据xpath进行定位分析,首先是找到价格的xpath,然后提取数据,对于商品名称,提取之后根据换行进行分割,然后保存, 然后就是分别找到商品的链接和编号,根据for遍历先储存商品名称和价格,评论的话就是调用上面的评论修正函数最有就是把数据进行保存,保存之后就进行翻页,继续爬取下一页的数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
def page_crawl(results):
res = pd.Series() # 记录单条商品信息
prices = driver.find_elements_by_xpath('//*[@id="J_goodsList"]/ul/li/div/div[2]/strong/i')
prices = [float(price.text) for price in prices]
goods = driver.find_elements_by_xpath('//*[@id="J_goodsList"]/ul/li/div/div[3]/a/em')
goods = [good.text.replace('\n', '') for good in goods]
links = driver.find_elements_by_xpath('//*[@id="J_goodsList"]/ul/li/div/div[3]/a') # 查找当前页面的商品链接
urls = [l.get_attribute('href') for l in links]
codes = [re.search('\d+', url).group() for url in urls]

for ii in range(len(prices)):
# print(len(prices))
res.name = codes[ii] # 这个name是Series的名字
res['good_name'] = goods[ii]
res['good_price'] = prices[ii]

# 评论数的抽取稍微复杂一些
# 1、他的xpath不再是排序的,而是J_comment_商品编号
# 2、有的单位是条,有单位是万条
com = driver.find_elements_by_xpath('//*[@id="J_comment_{}"]'.format(codes[ii]))
# print(com)
res['com_count'] = com_count(com[0].text) # 调用上面的万条评论的修正的函数
print(res['com_count'])

results = results.append(res) # 各商品记录
# 翻页
cl = driver.find_elements_by_xpath('//*[@id="J_bottomPage"]/span[1]/a[9]')
cl[0].click() # 点击“下一页”
sleep(5) # 等待
return results

results = pd.DataFrame()

关闭浏览器

1
2
3
4
5
for ii in range(5):
print(datetime.now(), ii)
results = page_crawl(results)

driver.close()

本文和爬取苏宁的代码相似,如有不明白的请看爬取苏宁这个文章