前言
我要把爬虫的终极利器介绍一下, 这个只要是我们肉眼能看到的, 就算在源码中或者在 json 中, 或是 post 也无法得到的数据, 我们都可以获取到, 雷同 F12 后源码暴露在你面前一样!
这次需要用到 selenium 家族的一些成员, 它们各司其职, 各个身怀绝技.
先介绍一下 selenium 模块: Selenium is a suite of tools specifically for automating web browsers.(Selenium 是一套专门用于自动化 web 浏览器的工具.)
---:(这里补充一下, 在需要用到这种大型模块的时候, 一定要去读官方文档, 不要去听百度里面和一些断章取义的人瞎写的内容, 他们更容易把你带偏.)
这个 Selenium 模块主要是应对我们自动浏览网页数据所需要用的, 让程序来执行半智能, 前提你要教会它去做什么事情!
直接介绍此次所需要用到的家族模块:
- from selenium import webdriver
- import time
- from selenium.webdriver.common.keys import Keys
- from selenium.webdriver.common.action_chains import ActionChains
- from selenium.webdriver.common.by import By
一, 每一个解释一下哈, 按顺序对号:
1, 主模块的嵌入, 主要是应对控制程序自动打开浏览器浏览网页功能.
2, 作为开发人员, 尤其是对网页自动化测试的开发工具必须需要 time 模块来制约程序的访问时间, 因为可能网站会直接把你 IP 封掉.
3,selenium 模块家族成员 Keys, 此成员是应当以模拟键盘操作, 应对模拟输入用户登录名和密码, 或者价值数据索引输入.
4,selenium 模块家族成员 ActionChains, 它则是应对模拟鼠标操作, 对与鼠标的双击, 单击, 左右键, 应对我们翻页, 搜索按钮的点击功能.
5,selenium 模块家族成员 By, 这个则是我们要教会它所要做的事情, 也是我们数据挖掘又要用到的核心价值功能之一, 应对价值数据抓取.
二, 开发初步:
1, 操作程序打开浏览器并打开我们需要进入的网页:
- url = 'https://www.xxx.com'
- driver=webdriver.Chrome()
- driver.get(url)
- time.sleep(5)
- driver.quit()
这里可以自己测试一下, 我所使用的是 Google 的浏览器, 你们可以尝试使用 Firefox, 他们有一些的区别, 主要是站点的区别!
2, 进入页面后锁定 tag
- html:
- <div id="aaa" class="bbb" name="ccc">
- <p></p>
- <p><a></p>
- </div>
- python:
- element = driver.find_element_by_id("aaa")
- frame = driver.find_element_by_tag_name("div")
- cheese = driver.find_element_by_name("ccc")
- cheeses = driver.find_elements_by_class_name("bbb")
- or
- from selenium.webdriver.common.by import By
- element = driver.find_element(by=By.ID, value="aaa")
- frame = driver.find_element(By.TAG_NAME, "div")
- cheese = driver.find_element(By.NAME, "ccc")
- cheeses = driver.find_elements(By.CLASS_NAME, "bbb")
这里每一个都是锁定 tag 树, 它们都是根据 id,class,name,tagname 来定义的.
- xpath_class = driver.find_element_by_xpath('//div[@class="bbb"]/p')
- xpath_id = driver.find_element_by_xpath('//div[@id="aaa"]/p')
这是通用方法的, Xpath 方法, 它们都输属于解析网页的内容锁定 tag.
3, 处理操作:
当我们锁定功能键的 tag 属性的时候, 我们就可以进一步操作, 比如换页, 搜索功能的实现, 对于模拟键盘输入的可以参考我的另一篇博客,python 自动化爬虫
这里我们就介绍一下模拟鼠标的操作:
- elem = driver.find_element_by_xpath('//a[@id="tagname"]')
- ActionChains(driver).double_click(elem).perform()
- time.sleep(3)
因为时间问题, 我只是介绍一下鼠标左键单击换页操作, 其他的何以参考一下官方文档: Selenium Webdrive https://www.seleniumhq.org/docs/03_webdriver.jsp
ActionChains: 锁定浏览器, double_click 锁定 tag 标签树,.perform(): 点击标签树
4, 获取价值数据
这里的操作类似与 Xpath 的语法:
- driver.find_elements_by_tag_name('td')[3].text
- driver.find_elements_by_tag_name('a').get_attribute('href')
这里注意一下 elements, 指所有的 tag-> a 比标签的 href, 这里是 list 格式, 需要遍历.
5, 最后来一串完整代码:
- from selenium import webdriver
- import time
- import lxml.html as HTML
- from bs4 import BeautifulSoup
- from selenium.webdriver.common.keys import Keys
- from selenium.webdriver.common.action_chains import ActionChains
- from pymongo import MongoClient,ASCENDING, DESCENDING
- from selenium.webdriver.common.by import By
- def parser():
- url = 'https://www.xxx.com'
- driver=webdriver.Chrome()
- driver.get(url)
- time.sleep(5)
- for i in range(1,675):
- a = driver.find_element_by_xpath('//div[@class="aaa"]')
- tr = a.find_elements_by_tag_name('tr')
- for j in xrange(1,len(tr)):
- quantity = tr[j].find_elements_by_tag_name('td')[3].text
- producturl = tr[j].find_elements_by_tag_name('td')[0].find_elements_by_tag_name("div")[1].find_element_by_tag_name('ul').find_element_by_tag_name('li').find_element_by_tag_name('a').get_attribute('href')
- producturl_db(producturl,quantity)
- elem = driver.find_element_by_xpath('//a[@id="eleNextPage"]')
- ActionChains(driver).double_click(elem).perform()
- time.sleep(3)
- driver.quit()
selenium 有个小 GUB, 就是在用 Xpath 的时候, 你已经找到父级 tag, 但是这个父级很多, 比如 tr, 你如果遍历它, 寻找 td 的话, 那么你还是使用 find_elements_by_tag_name, 因为那个会初始化, 不会管你找到那个父级. 所以这里是需要注意的!
最后祝你们加油!!!!!
来源: https://www.cnblogs.com/zhuPython/p/9300879.html