Python爬虫学习笔记 1-4:使用selenium爬取网页
Published On 2019/08/11 Sunday, Singapore
本节以爬取淘宝商品数据为例,讲解如何利用selelium爬取网页数据。
本文为Datacatsle Python爬虫(入门+进阶)课程学习笔记。
Selenium简介和配置
Selenium是一个用于浏览器自动化测试的框架,可以用来爬取任何网页上看到的公开数据。在使用selenium之前,按照以下步骤安装selenium库,下载chromedrive,并配置其路径为环境变量。
- Windows
- 安装: 在终端输入 pip install selenium
- 下载: 下载Chromedriver,解压后放在…\Google\Chrome\Application\。
- 环境变量:将…\Google\Chrome\Application\添加至环境变量。如果你的Chrome
- Mac
pip install selenium cd Downloads curl -O https://chromedriver.storage.googleapis.com/77.0.3865.40/chromedriver_mac64.zip unzip chromedriver_mac64.zip sudo mv chromedriver /usr/local/bin
chromedriver存放的路径可以自行定义,只要确保该路径被加入到系统变量即可。chromedriver有不同的版本,当其版本和Chrome browser版本时不匹配时无法正常使用。上面用到的chromedriver版本为77.0.3865.40。 如何确定适合自己的版本呢? 首先 chrome://settings/help 确认浏览器版本,然后到 https://chromedriver.chromium.org/downloads 中查找对应的版本下载连接。
完成以上步骤以后,用一段基本的代码进行测试:
import time
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://www.google.com/')
time.sleep(5) # Let the user actually see something!
search_box = driver.find_element_by_name('q')
search_box.send_keys('ChromeDriver')
search_box.submit()
time.sleep(5) # Let the user actually see something!
driver.quit()
如果已经将chromedriver所在路径加入到系统变量,但是运行程序时报错说chromedriver没有被加入到路径的话,可以尝试关闭ython程序再重新打开,或者在代码中指定chormedriver的路径,如下所示。
driver = webdriver.Chrome(/path/to/chromedriver)
淘宝商品数据实例
-
前往淘宝网: https://world.taobao.com/, 分析搜索框input和submit的xpath路径。然后通过input.end_keys(‘瑜伽服’)发送请求,submit.click()提交请求。
import time from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.common.exceptions import TimeoutException from pyquery import PyQuery as pq import re driver = webdriver.Chrome() wait = WebDriverWait(driver, 10) driver.get('https://world.taobao.com/') input = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#mq"))) submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'#J_PopSearch > div.sb-search > div > form > input[type=submit]:nth-child(2)'))) input.send_keys(u'瑜伽服') submit.click()
-
这时候会进入登陆界面,采用手机淘宝扫描二维码登陆。登陆以后我们来到以下界面.
<- 获得以上网页源代码并pyquery对网页进行解析,获取到第1页的数据。
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#mainsrp-itemlist .items .item'))) html = driver.page_source doc = pq(html) items = doc('#mainsrp-itemlist .items .item').items() product_list = [] for item in items: product = { 'image':item.find('.pic .img').attr('src'), 'price':item.find('.price').text(), 'deal':item.find('.deal-cnt').text()[:-3], 'title':item.find('.title').text(), 'shop':item.find('.shop').text(), 'location':item.find('.location').text(), } product_list.append(product)
-
找到翻页请求的路径。
#mainsrp-pager > div > div > div > div.form > input #mainsrp-pager > div > div > div > div.form > span.btn.J_Submit
page_number = 2 input = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#mainsrp-pager > div > div > div > div.form > input"))) submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.form > span.btn.J_Submit'))) input.clear() input.send_keys(page_number) submit.click() wait.until(EC.text_to_be_present_in_element((By.CSS_SELECTOR,'#mainsrp-pager > div > div > div > ul > li.item.active > span'),str(page_number)))
-
翻页并对每一页重复第3步的操作,从而获得所有数据。