有什么问题欢迎大家加QQ群:565712652进行讨论!

使用selenium爬取京东商品信息

Python爬虫 Jason zhou 4108℃ 0评论

今天我来分享一下如何使用Python的selenium库爬取京东商品信息。京东商品页面的每个商品都有商品名字,价格,店家信息,和评论数量等关于商品的信息,我要爬取的就是这些信息,通过商品名字,来获取一类商品的商品信息。

一,爬取思路分析

以爬取python书籍的商品信息为例,打开京东商城的首页,在搜索栏中输入 :python,点击搜索,有关Python的书籍就显示出来了,这时我们查看一下地址栏中的URL:

https://search.jd.com/Search?keyword=python&enc=utf-8&wq=python&pvid=1a6e8c7fb20f439dacd2dabfca18ede2

由于URL中的有些参数可以去掉,这里保留enc=utf-8这个参数,不然当关键字为中文时会出错。因此上面的URL我们可以简化成下面形式:

https://search.jd.com/Search?keyword=python&enc=utf-8

你可以把这个URL输入到地址栏中,然后你会得到和刚才相同的页面。接下来点击第2页,URL变成了:

https://search.jd.com/Search?keyword=python&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&wq=python&page=3&s=58&click=0

简化后:

https://search.jd.com/Search?keyword=python&enc=utf-8&page=3

再看第3页:

https://search.jd.com/Search?keyword=python&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&page=5&s=101&click=0

URL简化后为:

https://search.jd.com/Search?keyword=python&enc=utf-8&page=5

由此我们可以发现URL随页数的变化规律为:

url = 'https://search.jd.com/Search?keyword=' + str(product) + "&enc=utf-8&page=" +  str(page)

其中product是商品名,page = index * 2 – 1(index是页数)。下面我们来看一下商品信息在网页源代码中的位置,将鼠标置于页面商品信息位置处,然后右键-检查,你会发现商品信息在下面的标签里面:

细数li标签的个数发现只有30个,而一页有60本书的展示信息,只有一半,如果此时你使用requests库去爬取的话,只能每页获取到30个商品信息(一半)。但是如果你滑动鼠标至页面底部,此时再检查页面源代码,发现包含商品信息的li标签有60个,因此此时的网页源代码才是我们需要获取的。

二,使用selenium实现与页面之间的交互

我们要获取包含全部商品信息的网页源代码就需要和页面进行交互,即要让页面滑至底部。我们使用selenium中的driver.execute_script()方法来执行向下滑动至页面底部的js脚本。具体实现:

# 导入模块
from selenium import webdriver    
driver = webdriver.Chrome()
driver.get(url)
# 执行页面向下滑至底部的动作
driver.execute_script("window.scrollTo(0,document.body.scrollHeight);")

页面滑至底部后,停顿几秒待页面加载完成!使用driver.page_source方法来返回此时页面的源代码。

# 停顿5秒等待页面加载完毕!!!(必须留有页面加载的时间,否则获得的源代码会不完整。)
time.sleep(5)
# 返回此时的网页源代码
html_sourcode = driver.page_source

三,解析页面

解析页面我们用bs4库,找到对应的的信息所在位置的标签,然后用find()方法一个一个地提取出这些信息,定义一个提取这些商品信息的函数:

# 提取商品信息
def parser(html, i, filepath):

    soup = BeautifulSoup(html, 'html5lib')

    # 总页数
    total = eval(soup.find('span', 'p-skip').em.b.text)
    # 定位到包含这些商品信息的代码
    items = soup.find_all('div', 'gl-i-wrap')

    for item in items:
        # 商品名称
        p_name = item.find('div', 'p-name').a.em.text
        # 商品价格
        p_price = item.find('div', 'p-price').strong.text

        # 店家信息
        p_shopinfo = item.find('div', re.compile('p-shop'))

        if p_shopinfo.a is None:
            p_shop = p_shopinfo.span.text
        else:
            p_shop = p_shopinfo.a.text

        # 评论数量
        p_comment = item.find('div', 'p-commit').strong.a.text
        # 写入文件

        with open(filepath, 'at', encoding="utf-8") as f:
            f.write("{}.商品名称:{}  价格:{}  店家信息:{}  评论数量:{}\n".format(i, p_name, p_price, p_shop, p_comment))

        # 可视化输出
        print("{}.商品名称:{}  价格:{}  店家信息:{}  评论数量:{}".format(i, p_name, p_price, p_shop, p_comment))
        # 统计这一页有多少商品
        i += 1
    return total, i

四,总结

爬取京东商品信息的关键是实现与页面之间的交互(即让页面滑动至底部),这样才能获取到包含全部60个商品信息的源代码,其他的话都是比较好处理的。

源代码地址(Github):京东商品信息爬虫源代码

我之前也写过一篇爬取京东商品图片的文章:利用python爬取京东商城商品图片,爬取思路是一致的,大家也可以参考一下!

转载请注明:志颖博客 » 使用selenium爬取京东商品信息

喜欢 (10)or分享 (0)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址