Python爬虫学习笔记 1-4:使用selenium爬取网页

Published On 2019/08/11 Sunday, Singapore

本节以爬取淘宝商品数据为例,讲解如何利用selelium爬取网页数据。

本文为Datacatsle Python爬虫(入门+进阶)课程学习笔记。



Selenium简介和配置

Selenium是一个用于浏览器自动化测试的框架,可以用来爬取任何网页上看到的公开数据。在使用selenium之前,按照以下步骤安装selenium库,下载chromedrive,并配置其路径为环境变量。

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) 



淘宝商品数据实例

  1. 前往淘宝网: 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()
    
  2. 这时候会进入登陆界面,采用手机淘宝扫描二维码登陆。登陆以后我们来到以下界面.

    <
    1. 获得以上网页源代码并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)
    
  3. 找到翻页请求的路径。

    #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)))
    
  4. 翻页并对每一页重复第3步的操作,从而获得所有数据。





💚 Back to Home