美文网首页
Python爬虫 | Selenium进阶

Python爬虫 | Selenium进阶

作者: 生信师姐 | 来源:发表于2020-05-10 13:03 被阅读0次

示例:爬取京东

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>&lt;</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>&gt;</i>
            </a>
        </span>

        <span class="p-skip">
            <em>共<b>100</b>页&nbsp;&nbsp;到第</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>&lt;</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>&gt;</i></a>
    </span>
    <span class="p-skip">
        <em>共<b>100</b>页&nbsp;&nbsp;到第</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>

最终获得的数据如下

参考链接:https://blog.csdn.net/eye_water/category_7159130.html

相关文章

网友评论

      本文标题:Python爬虫 | Selenium进阶

      本文链接:https://www.haomeiwen.com/subject/krgwihtx.html