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

导入包

from time import sleep

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

对DataFrame处理

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

评论处理

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

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

浏览器初始化

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

查询的网页

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遍历先储存商品名称和价格,评论的话就是调用上面的评论修正函数最有就是把数据进行保存,保存之后就进行翻页,继续爬取下一页的数据

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()

关闭浏览器

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

driver.close()

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

猜你喜欢

转载自blog.csdn.net/weixin_51756104/article/details/121286657