对于静态网页,只需要把网页地址栏中的url传到get请求中就可以轻松地获取到网页的数据。但是,经常会遇到直接把网页地址栏中的url传到get请求中无法直接获取到网页的数据的情况,而且右键查看网页源代码也无法看到网页的数据,同时点击第二页、第三页等进行翻页的时候,网页地址栏中的url也没变,这些就是动态网页。
动态网页数据收集有两种方式:
第一种:
先分析网页数据获取和跳转的逻辑,再去写代码。
第二种:
Selenium+WebDriver,驱动浏览器,模拟用户输入,获取目标网页源码。
(第一种我不会,就直接选第二种,相比第一种,Selenium+WebDriver优点是逻辑简单,编码时间短,缺点是driver运行慢)
Selenium
安装:
pip install torchtext(我也不知道为什么要装这个,但是直接install selenium就是不行)
pip install selenium
WebDriver
根据自己的浏览器和版本安装:
chrome浏览器的web driver(chromedriver.exe),可以在下面网址访问:
http://npm.taobao.org/mirrors/chromedriver/
firefox(火狐浏览器)的**web driver (geckodriver.exe)**在这里访问:
https://github.com/mozilla/geckodriver/releases
其他浏览器驱动可以见下面列表:
Edge:https://developer.microsoft.com/en-us/micrsosft-edage/tools/webdriver
Safari:https://webkit.org/blog/6900/webdriver-support-in-safari-10/
以谷歌浏览器为例:
在浏览器设置–>>关于Chrome查看浏览器版本,再下载对应的chromedriver
chromedriver.exe放到python.exe的同级目录下
运行下面的代码测试,弹出浏览器打开百度就可以了
chromedriver测试代码
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
无界面测试代码 (Headless是无界面模式)
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options=Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
driver=webdriver.Chrome(options=chrome_options)
driver.get("http://www.baidu.com")
print(driver.title)
driver.close()
driver.quit()
简单实战
在1688搜索键盘,根据成交额排序,收集商品名和复购率数据
- 浏览器打开网站
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from time import sleep
#设置浏览器窗口大小,设大一点才能点击到
window_width=2048
window_height=2048*20
driver=webdriver.Chrome()
driver.set_window_size(window_width, window_height)
driver.get("https://www.1688.com/")
ps:有的界面需要滚动才会动态加载内容,可以把窗口设置大一点,当然也可以调用driver的滚动方法。
- 找到搜索框和搜索按钮
#输入查找关键字
element = driver.find_element_by_css_selector('#home-header-searchbox')
element.send_keys('键盘')#模拟输入文字
#点击搜索
element = driver.find_element_by_css_selector('#search-tab-wrap > div.search-box-wrap > div > div > div.ali-search > form > fieldset > div > div.alisearch-action > button')
element.click()#模拟鼠标点击
3 切换到新窗口
点击搜索后,打开了新的窗口,切换到新窗口
#打开搜索产品的窗口
driver.switch_to.window(driver.window_handles[-1])
- 点击成交额
#点击成交额
element = driver.find_element_by_css_selector('#search-filtItems > div.filter-item-container > ul > li:nth-child(2) > a > span')
element.click()
sleep(2)#等待一会儿 加载完这一页所有产品
- 获取当前页产品文本和复购率文本
for i in range(1,30):
try:
element = driver.find_element_by_xpath('//*[@id="sm-offer-list"]/div['+str(i)+']/div/div[2]/a/div')
etext=element.text
element =driver.find_element_by_xpath('//*[@id="sm-offer-list"]/div['+str(i)+']/div/div[3]/div[2]/span')
fugou=element.text
print(etext+' '+fugou)#这里就输出到控制台
except Exception:
print('index:'+str(i)+'获取失败')
#print(traceback.format_exc()) #输出堆栈 需要import traceback
sleep(1000)
driver.close()
driver.quit()
print('退出')
获取UI元素的技巧
-
在对应的UI上右键,选中检查
-
在弹出的窗口会定位到这个UI组件的标签块,对这个标签块再右键Copy
根据自己的习惯选择复制的选项,常用的有css selector和xpath