Python动态网页数据收集

对于静态网页,只需要把网页地址栏中的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搜索键盘,根据成交额排序,收集商品名和复购率数据

  1. 浏览器打开网站
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的滚动方法

  1. 找到搜索框和搜索按钮
#输入查找关键字
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])
  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)#等待一会儿 加载完这一页所有产品
  1. 获取当前页产品文本和复购率文本
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元素的技巧

  1. 在对应的UI上右键,选中检查

  2. 在弹出的窗口会定位到这个UI组件的标签块,对这个标签块再右键Copy
    根据自己的习惯选择复制的选项,常用的有css selector和xpath

史上最全!Selenium元素定位的30种方式

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值