• selenium京东商城爬取


     该项目主要参考与:http://c.biancheng.net/python_spider/selenium-case.html

    你看完上述项目内容之后,会发现京东登录是一个比较坑的点,selenium控制浏览器没有登录京东,导致我们自动爬取网页被重定向到京东登录注册页面。

    因此,我们要单独能一个登录注册。

    但是,发现京东的验证功能 -- 滑动图片/发送验证码到手机目前我没办法解决,因此我们可以手动验证:我们启动浏览器,自己手动验证完之后,跳转到京东首页

    1. 登录功能

    1. # 登录
    2. def login_html(self, loginname, password):
    3. self.browser.get(url=self.url)
    4. # 进入登录页面
    5. self.browser.find_element(by=By.LINK_TEXT, value='你好,请登录').click()
    6. time.sleep(2)
    7. # 选择账户登录方式
    8. self.browser.find_element(by=By.LINK_TEXT, value='账户登录').click()
    9. # 输入框输入账号和密码
    10. self.browser.find_element(value='loginname').send_keys(loginname)
    11. self.browser.find_element(value='nloginpwd').send_keys(password)
    12. time.sleep(2)
    13. # 登录
    14. self.browser.find_element(value='loginsubmit').click()
    15. # 登录成功会跳转到京东首页,并且没有请登录字段。
    16. # 延长30s,自己手工验证;30s,之内没验证,自动断开
    17. start_time = time.time()
    18. while True:
    19. condition = (self.browser.page_source.find('你好,请登录') == -1) and (
    20. self.browser.current_url == 'https://www.jd.com/')
    21. # 如果登录成功,跳出循环
    22. if condition:
    23. return True
    24. time1 = int(time.time() - start_time)
    25. # 60s没验证成功,直接终止selenium进程
    26. if time1 >= 60:
    27. self.browser.quit()
    28. return False

    2.完整代码 

    1. from selenium import webdriver
    2. import time
    3. from selenium.webdriver.common.by import By
    4. class JdSpider(object):
    5. def __init__(self):
    6. self.url = 'https://www.jd.com/'
    7. self.browser = webdriver.Chrome() # 创建无界面参数的浏览器对象
    8. self.i = 0 # 计数,一共有多少件商品
    9. # 输入地址+输入商品+点击按钮,切记这里元素节点是京东首页的输入栏、搜索按钮
    10. def get_html(self):
    11. self.browser.find_element(by=By.XPATH, value='//*[@id="key"]').send_keys('python书籍')
    12. self.browser.find_element(by=By.XPATH, value="//*[@class='form']/button").click()
    13. # 登录
    14. def login_html(self, loginname, password):
    15. self.browser.get(url=self.url)
    16. # 进入登录页面
    17. self.browser.find_element(by=By.LINK_TEXT, value='你好,请登录').click()
    18. time.sleep(2)
    19. # 选择账户登录方式
    20. self.browser.find_element(by=By.LINK_TEXT, value='账户登录').click()
    21. # 输入框输入账号和密码
    22. self.browser.find_element(value='loginname').send_keys(loginname)
    23. self.browser.find_element(value='nloginpwd').send_keys(password)
    24. time.sleep(2)
    25. # 登录
    26. self.browser.find_element(value='loginsubmit').click()
    27. # 登录成功会跳转到京东首页,并且没有请登录字段。
    28. # 延长30s,自己手工验证;30s,之内没验证,自动断开
    29. start_time = time.time()
    30. while True:
    31. condition = (self.browser.page_source.find('你好,请登录') == -1) and (
    32. self.browser.current_url == 'https://www.jd.com/')
    33. # 如果登录成功,跳出循环
    34. if condition:
    35. return True
    36. time1 = int(time.time() - start_time)
    37. # 60s没验证成功,直接终止selenium进程
    38. if time1 >= 60:
    39. self.browser.quit()
    40. return False
    41. def get_data(self):
    42. # 执行js语句,拉动进度条件, 把进度条件拉倒最底部+提取商品信息
    43. self.browser.execute_script(
    44. 'window.scrollTo(0,document.body.scrollHeight)'
    45. )
    46. # 给页面元素加载时预留时间
    47. time.sleep(2)
    48. # 用 xpath 提取每页中所有商品,最终形成一个大列表
    49. li_list = self.browser.find_elements(by=By.XPATH, value='//*[@id="J_goodsList"]/ul/li')
    50. for li in li_list:
    51. # 构建空字典
    52. item = {}
    53. item['name'] = li.find_element(by=By.XPATH, value='.//div[@class="p-name"]/a/em').text.strip()
    54. item['price'] = li.find_element(by=By.XPATH, value='.//div[@class="p-price"]').text.strip()
    55. item['count'] = li.find_element(by=By.XPATH, value='.//div[@class="p-commit"]/strong').text.strip()
    56. item['shop'] = li.find_element(by=By.XPATH, value='.//div[@class="p-shopnum"]').text.strip()
    57. print(item)
    58. self.i += 1
    59. def run(self):
    60. is_login = self.login_html(loginname, password)
    61. # 如果登录失败直接终结函数
    62. if not is_login :
    63. return
    64. self.get_html()
    65. # 循环执行点击“下一页”操作
    66. while True:
    67. # 获取每一页要抓取的数据
    68. self.get_data()
    69. # 判断是否是最一页
    70. if self.browser.page_source.find('pn-next disabled') == -1:
    71. self.browser.find_element(by=By.CLASS_NAME, value='pn-next').click()
    72. # 预留元素加载时间
    73. time.sleep(1)
    74. else:
    75. print('数量', self.i)
    76. break
    77. time.sleep(3)
    78. self.browser.quit()
    79. if __name__ == '__main__':
    80. loginname = '用户名'
    81. password = '密码'
    82. spider = JdSpider()
    83. spider.run()

  • 相关阅读:
    Android studio的Bumblebee版本Gradle7.2降到Gradle4.2.0详细步骤记录(项目已上传)
    【单元测试】--测试驱动开发(TDD)
    html 铆钉跳转指定元素 元素id
    java计算机毕业设计家装行业门店订单管理系统源码+mysql数据库+系统+lw文档+部署
    峟思科普小(1)型土石坝安全监测设备的基本配置与策略
    k8s运维面试
    C++继承(跑路人笔记)
    MongoDB聚合运算符:$sinh
    多元统计分析 实验一、多元统计数据的图标表示法
    CSS 网格容器:构建响应式网页布局的强大工具
  • 原文地址:https://blog.csdn.net/Qhx20040819/article/details/133523049