示例:爬取京东
from selenium import webdriver
import time
class JdSpider(object):
def __init__(self):
self.i = 0
self.url = 'https://www.jd.com/'
self.browser = webdriver.Chrome('D:\download\爬虫\chromedriver.exe')
# 获取页面信息 - 到具体商品的页面
def get_html(self):
self.browser.maximize_window()
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(3) # 给商品页面加载时间
# 解析页面
def parse_html(self):
# 把下拉菜单拉到底部,执行JS脚本
for i in range(5):
self.browser.execute_script('window.scrollTo(0,document.body.scrollHeight)')
time.sleep(2)
# 提取所有商品节点对象列表 li列表
li_list = self.browser.find_elements_by_xpath('//*[@id="J_goodsList"]/ul/li')
for li in li_list:
info_list = li.text.split('\n')
if info_list[1].startswith('¥'):
price = info_list[1]
name = info_list[2]
comment = info_list[3]
store = info_list[4]
else:
price = info_list[0]
name = info_list[1]
comment = info_list[2]
store = info_list[3]
print(price, comment, store, name)
self.i += 1
# 主函数
def main(self):
self.get_html()
while True:
self.parse_html()
# 判断是否该点击下一页,没有找到说明不是最后一页
if self.browser.page_source.find('pn-next disabled') == -1:
self.browser.find_element_by_class_name('pn-next').click()
time.sleep(2)
else:
with open('./jingdong.html', 'w', encoding='utf-8') as f:
f.write(self.browser.page_source)
break
print(self.i)
if __name__ == '__main__':
spider = JdSpider()
spider.main()
分析:
问题一:由于格式不统一,获得的li标签里的内容有如下2种形式
第一种:价格+书名+评价数量+店铺名称
['¥45.60', '用Python写网络爬虫 第2版 12.9-12.12图书嗨购!自营图书每满100减50,满减叠券享400减250!(具体优惠信息以商品详情页为准)立即抢购', '2.7万+条评价', '京东自营', '自营', '满减', '放心购', '关注', '加入购物车', '广告']
第二种:从第二项开始符合上面规则:即杂+价格+书名+评价数量+店铺名称,所以,判断第二项,是以¥开头即可
['暖冬读好书满99减10 (12.9-12.16)', '¥69.00', 'python编程 从入门到实践 零基础学python3.5 pathon核心技术网络籍', '400+条评价', '阅轩图书专营店', '券7-5', '关注', '加入购物车']
['每满100减50 (12.8-12.12)', '¥54.90', '精通Python爬虫框架Scrapy 12.9-12.12图书嗨购!自营图书每满100减50,满减叠券享400减250!(具体优惠信息以商品详情页为准)立即抢购', '2.7万+条评价', '人民邮电出版社', '自营', '放心购', '关注', '加入购物车', '电子书', '¥19.99']
网页一直在变化,如果包含更多情况,也可以使用逻辑&&或者||进一步分析
问题二:由于页码处是js生成的,所以通过找是否下一页来获取,所有页码的数据
分析发现第一页和最后一页,只有在一个地方不同
<div class="page clearfix">
<div id="J_bottomPage" class="p-wrap">
<span class="p-num">
<a class="pn-prev disabled"><i><</i><em>上一页</em></a>
<a href="javascript:;" class="curr">1</a>
<a onclick="SEARCH.page(3, true)" href="javascript:;">2</a>
<a onclick="SEARCH.page(5, true)" href="javascript:;">3</a>
<a onclick="SEARCH.page(7, true)" href="javascript:;">4</a>
<a onclick="SEARCH.page(9, true)" href="javascript:;">5</a>
<a onclick="SEARCH.page(11, true)" href="javascript:;">6</a>
<a onclick="SEARCH.page(13, true)" href="javascript:;">7</a>
<b class="pn-break">...</b>
<a class="pn-next" onclick="SEARCH.page(3, true)" href="javascript:;" title="使用方向键右键也可翻到下一页哦!">
<em>下一页</em><i>></i>
</a>
</span>
<span class="p-skip">
<em>共<b>100</b>页 到第</em>
<input class="input-txt" type="text" value="1" onkeydown="javascript:if(event.keyCode==13){SEARCH.page_jump(100,1);return false;}"><em>页</em>
<a class="btn btn-default" onclick="SEARCH.page_jump(100,1)" href="javascript:;">确定</a>
</span>
只有,下一页是可以使用的,就点击执行onclick操作
<div id="J_bottomPage" class="p-wrap">
<span class="p-num">
<a class="pn-prev" onclick="SEARCH.page(197, true)" href="javascript:;" title="使用方向键左键也可翻到上一页哦!"><i><</i><em>上一页</em></a>
<a onclick="SEARCH.page(1, true)" href="javascript:;">1</a>
<a onclick="SEARCH.page(3, true)" href="javascript:;">2</a><b class="pn-break">...</b>
<a onclick="SEARCH.page(191, true)" href="javascript:;">96</a>
<a onclick="SEARCH.page(193, true)" href="javascript:;">97</a>
<a onclick="SEARCH.page(195, true)" href="javascript:;">98</a>
<a onclick="SEARCH.page(197, true)" href="javascript:;">99</a>
<a href="javascript:;" class="curr">100</a>
<a class="pn-next disabled"><em>下一页</em><i>></i></a>
</span>
<span class="p-skip">
<em>共<b>100</b>页 到第</em>
<input class="input-txt" type="text" value="100" onkeydown="javascript:if(event.keyCode==13){SEARCH.page_jump(100,1);return false;}"><em>页</em>
<a class="btn btn-default" onclick="SEARCH.page_jump(100,1)" href="javascript:;">确定</a>
</span>
</div>
最终获得的数据如下
网友评论