经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Python3 » 查看文章
python3通过selenium爬虫获取到dj商品
来源:jb51  时间:2019/4/25 10:21:47  对本文有异议

先给大家介绍下python3 selenium使用

其实这个就相当于模拟人的点击事件来连续的访问浏览器。如果你玩过王者荣耀的话在2016年一月份的版本里面就有一个bug。

安卓手机下载一个按键精灵就可以在冒险模式里面设置按键,让手机自动玩闯关,一局19个金币,一晚上就一个英雄了。不过

程序员也不是吃素的。给一个星期设置了大概4000金币上限。有兴趣的可以去试试。(注:手机需要root)

进入正题:

  1. from selenium import webdriver
  2. from selenium.webdriver.common.by import By
  3. from selenium.webdriver.common.keys import Keys
  4. from selenium.webdriver.support import expected_conditions as EC
  5. from selenium.webdriver.support.wait import WebDriverWait

在写之前需要下载selenium模块

  1. brguge=webdriver.Chrome()#声明驱动对象
  2. try:
  3. brguge.get('https://www.baidu.com')#发送get请求
  4. input=brguge.find_element_by_id('kw')#找到目标
  5.  
  6. input.send_keys('python')#输入python关键字
  7. input.send_keys(Keys.ENTER)#敲入回车
  8. wait=WebDriverWait(brguge,10)#等待元素加载出来
  9. wait.until(EC.presence_of_element_located(By.ID,'content_left'))#加载
  10. print(brguge.current_url)#输出搜索的路径
  11. print(brguge.get_cookie())#输出cookie
  12. print(brguge.page_source)#输出结果源代码
  13. finally:
  14. brguge.close()#关闭谷歌浏览器

下面是一些selenium模块的基本用法

查找元素

    单个元素  

  1. (from selenium import webdriver)
  2.  
  3.  
  4. brguge.find_element_by_id('q')用这个元素找idq的元素
  5. brguge.find_element_by_css_selector('#q')找css样式是q
  6. brguge.find_element_by_xpath('//*[ @id="q"]')三个效果一样
  7. brguge.find_element_by_name()通过name来查找
  8. brguge.find_element_by_link_text()通过link来查找
  9. brguge.find_element_by_partial_link_text()
  10. brguge.find_element_by_tag_name()
  11. brguge.find_element_by_class_name()通过class查找
  12. from selenium import webdriver
  13. from selenium.webdriver.common.by import By
  14. brguge.find_element(By.ID,'Q')通用查找方式

    多个元素(find_elements)加了个s
        他会以列表的形式打印出来
        brguge.find_elements_by_css_selector('.service-bd li')css样式为li的元素
        brguge.find_elements(By.css_selector,'.service-bd li')两个作用一样
        (利用索引就可以获取单个或多个元素了)
    元素交互操作(获取元素然后再给他指令)
        选择输入框 --》send_keys('输入文字')--》clear()清空输入框--在输入别的--》找到搜索--》click(点击)
        input.clear()清空按钮
    交互动作(将动作附加到动作链中串行执行)
        switch_to_frame('iframeResult')
        用css样式分别找到两个要交互
        调用ActionChains(调用谷歌的)
        drag_and_drop(source,target)第一个到第二个上面
        perform()

下面看下python3通过selenium爬虫获取到dj商品的实例代码。

具体代码如下所示:

  1. from selenium import webdriver
  2. from selenium.webdriver.common.by import By
  3. from selenium.webdriver.common.keys import Keys
  4. from selenium.webdriver.support.wait import WebDriverWait
  5. from selenium.webdriver.support import expected_conditions as EC
  6. from selenium.webdriver.chrome.options import Options
  7. from selenium.common.exceptions import NoSuchElementException
  8. from lxml import etree
  9. import time, json
  10. JD_URL_Login = "https://www.jd.com/"
  11. class CustomizeException(Exception):
  12. def __init__(self, status, msg):
  13. self.status = status
  14. self.msg = msg
  15. class JD:
  16. def __init__(self):
  17. self.browser = None
  18. self.__init_browser()
  19. def __init_browser(self):
  20. options = Options()
  21. options.add_argument("--headless")
  22. options.add_experimental_option('excludeSwitches', ['enable-automation'])
  23. # 设置为无图模式
  24. options.add_experimental_option("prefs", {"profile.managed_default_content_settings.images": 2})
  25. self.browser = webdriver.Chrome(options=options)
  26. # 设置浏览器最大化窗口
  27. self.browser.maximize_window()
  28. # 隐式等待时间为3s
  29. self.browser.implicitly_wait(3)
  30. self.browser.get(JD_URL_Login)
  31. self.wait = WebDriverWait(self.browser, 10)
  32. def __search_goods(self, goods):
  33. '''搜索商品的方法'''
  34. self.file = open("jd-{}.json".format(goods), "a", encoding="utf-8")
  35. self.wait.until(EC.presence_of_all_elements_located((By.ID, "key")))
  36. serach_input = self.browser.find_element_by_id("key")
  37. serach_input.clear()
  38. serach_input.send_keys(goods, Keys.ENTER)
  39. def __get_goods_info(self, page_source):
  40. '''从网页源码中获取到想要的数据'''
  41. selector_html = etree.HTML(page_source)
  42. # 商品名字 不要获取title属性,以后再改吧,最好是获取到商品名的文本内容
  43. goods_name = selector_html.xpath("//div[@class='gl-i-wrap']//div[contains(@class,'p-name')]/a/@title")
  44. # 商品价格
  45. goods_price = selector_html.xpath("//div[@class='gl-i-wrap']//div[@class='p-price']/strong/i/text()")
  46. # 商品评价数量
  47. comment_num_selector = selector_html.xpath("//div[@class='p-commit']/strong")
  48. comment_num = [selector.xpath("string(.)") for selector in comment_num_selector]
  49. # 商品店铺
  50. shop_name = selector_html.xpath("//a[@class='curr-shop']/text()")
  51. goods_zip = zip(goods_name, goods_price, comment_num, shop_name)
  52. for goods_info in goods_zip:
  53. dic = {}
  54. dic["goods_name"] = goods_info[0]
  55. dic["goods_price"] = goods_info[1]
  56. dic["comment_num"] = goods_info[2]
  57. dic["shop_name"] = goods_info[3]
  58. # print("商品名字>>:", goods_info[0])
  59. # print("商品价格>>:", goods_info[1])
  60. # print("商品评价数量>>:", goods_info[2])
  61. # print("商品店铺>>:", goods_info[3])
  62. # print("*" * 100)
  63. yield dic
  64. def __swipe_page(self):
  65. '''上下滑动页面,将完整的网页源码返回'''
  66. height = self.browser.execute_script("return document.body.scrollHeight;")
  67. js = "window.scrollTo(0, {});".format(height)
  68. self.browser.execute_script(js)
  69. while True:
  70. time.sleep(1)
  71. now_height = self.browser.execute_script("return document.body.scrollHeight;")
  72. if height == now_height:
  73. return self.browser.page_source
  74. js = "window.scrollTo({}, {});".format(height, now_height)
  75. self.browser.execute_script(js)
  76. height = now_height
  77. def __is_element_exists(self, xpath):
  78. '''检测一个xpath是否能够找到'''
  79. try:
  80. self.browser.find_element_by_xpath(xpath=xpath)
  81. return True
  82. except NoSuchElementException:
  83. return False
  84. def __click_next_page(self):
  85. '''点击下一页,实现翻页功能'''
  86. self.wait.until(EC.presence_of_all_elements_located((By.CLASS_NAME, "pn-next")))
  87. xpath = "//a[@class='pn-next']"
  88. if not self.__is_element_exists(xpath):
  89. raise CustomizeException(10000, "该商品访问完毕")
  90. self.browser.find_element_by_xpath(xpath).click()
  91. def __write_to_json(self, dic: dict):
  92. data_json = json.dumps(dic, ensure_ascii=False)
  93. self.file.write(data_json + "\n")
  94. def run(self, goods):
  95. self.__search_goods(goods)
  96. n = 1
  97. while True:
  98. print("正在爬取商品 <{}>---第{}页......".format(goods, n))
  99. time.sleep(3)
  100. html = self.__swipe_page()
  101. for dic in self.__get_goods_info(html):
  102. self.__write_to_json(dic)
  103. try:
  104. self.__click_next_page()
  105. except CustomizeException:
  106. try:
  107. goods = goods_list.pop(0)
  108. self.run(goods)
  109. except IndexError:
  110. return
  111. n += 1
  112. def __del__(self):
  113. self.browser.close()
  114. self.file.close()
  115. if __name__ == '__main__':
  116. jd = JD()
  117. goods_list = ["纯牛奶", "酸奶", "奶茶", "床上用品", "电磁炉", "电视", "小米笔记本", "华硕笔记本", "联想笔记本", "男士洗面奶", "女士洗面奶", "沐浴露", "洗发露",
  118. "牙刷", "牙膏", "拖鞋", "剃须刀", "水手服", "运动服", "红龙果", "苹果", "香蕉", "洗衣液", "电饭煲"]
  119. try:
  120. goods = goods_list.pop(0)
  121. except IndexError:
  122. raise CustomizeException(20000, "goods_list不能为空")
  123. try:
  124. jd.run(goods)
  125. finally:
  126. del jd

总结

以上所述是小编给大家介绍的python3通过selenium爬虫获取到dj商品的实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对w3xue网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号