今天我来分享一下如何使用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爬取京东商城商品图片,爬取思路是一致的,大家也可以参考一下!
喜欢 (10)or分享 (0)