京东爬虫案例
- 目标
1、目标网址 :https://www.jd.com/
2、抓取目标 :商品名称、商品价格、评价数量、商品商家
- 思路提醒
1、打开京东,到商品搜索页
2、匹配所有商品节点对象列表
3、把节点对象的文本内容取出来,查看规律,是否有更好的处理办法?
4、提取完1页后,判断如果不是最后1页,则点击下一页
# 如何判断是否为最后1页???
对于滑动滚轮动态加载数据的内容,爬取思路:
利用selenium+phantomjs/Chrome/Firefox,打开页面后,将滚动条拉到最下面,然后等页面加载出来,进行爬取。这种爬取方法效率比较慢,但是基本上网站的内容都可以爬取。
附selenium+phantomjs/Chrome/Firefox安装教程:https://blog.csdn.net/weixin_44706011/article/details/103550730
- 实现步骤
- 找节点
1、首页搜索框 : //*[@id="key"]
2、首页搜索按钮 ://*[@id="search"]/div/div[2]/button
3、商品页的 商品信息节点对象列表 ://*[@id="J_goodsList"]/ul/li
- 执行JS脚本,获取动态加载数据
# 将滚动条拉到最下面
browser.execute_script(
'window.scrollTo(0,document.body.scrollHeight)'
)
- 代码实现
'''
抓取京东商品信息---->selenium+chrome
'''
from selenium import webdriver
import time
class JDSpider(object):
def __init__(self):
self.browser = webdriver.Chrome()
self.url = 'https://www.jd.com/'
self.count = 0
# 获取商品页面
def get_page(self):
# 打开京东
self.browser.get(self.url)
# 找两个节点
# 输入搜索内容
self.browser.find_element_by_xpath('//*[@id="key"]').send_keys('人工智能书籍')
# 点击搜索
self.browser.find_element_by_xpath('//*[@id="search"]/div/div[2]/button').click()
# 留出时间给页面加载
time.sleep(2)
# 解析页面
def parse_page(self):
# 把进度条拉到最下面
# 执行js脚本,将下拉条拉到最下面
self.browser.execute_script(
'window.scrollTo(0,document.body.scrollHeight)'
)
# 匹配所有商品节点对象列表
li_list = self.browser.find_elements_by_xpath('//*[@id="J_goodsList"]/ul/li')
for li in li_list:
# 遍历商品列表,将一些特殊数据做处理
info = li.text.split('\n')
if info[0].startswith('每满'):
price = info[1]
name = info[2]
number = info[3]
market = info[4]
elif info[0] == '单件':
price = info[3]
name = info[4]
number = info[5]
market = info[6]
elif info[0].startswith('¥') and info[1].startswith('¥'):
price = info[0]
name = info[2]
number = info[3]
market = info[4]
else:
price = info[0]
name = info[1]
number = info[2]
market = info[3]
print(price, number, market, name)
self.count += 1
def main(self):
self.get_page()
while True:
self.parse_page()
# 判断是否为最后一页
# 不是最后一页,点击下一页
if self.browser.page_source.find('pn-next disabled') == -1:
# 不是最后一页,找到下一页的按钮
self.browser.find_element_by_class_name('pn-next').click()
time.sleep(5)
# 如果是最后一页,break退出
else:
break
print(self.count)
if __name__ == "__main__":
spider = JDSpider()
spider.main()
chromedriver设置无界面模式
from selenium import webdriver
options = webdriver.ChromeOptions()
# 添加无界面参数
options.add_argument('--headless')
browser = webdriver.Chrome(options=options)
browser.get('http://www.baidu.com/')
browser.save_screenshot('baidu.png')
附git地址:https://github.com/RyanLove1/spider_code