python爬蟲基礎

1. 前言

我不是專業爬蟲工程師,只是業餘爬點數據做做分析和挖掘工作,所以沒有使用到複雜的反爬蟲和線程池等技術,也沒有用到beautifulSoup這樣的神庫。但是並不影響我輕鬆爬取網頁數據。
這裏簡單記錄下瀏覽器操作,源碼讀取,以及數據提取的方法,夠用了。

2. selenium操作chrome瀏覽器

2.1. 安裝chrome瀏覽器和瀏覽器驅動

首先你需要安裝chrome瀏覽器,以及下載對應的chromedriver.exe驅動,並將chromedriver.exe驅動目錄添加至path環境變量,簡單的做法是將chromedriver.exe驅動放到python的安裝目錄即可。
chromedriver驅動和chrome的版本對應關係在每個chromedriver驅動下載目錄的notes.txt文件都有說明,chromedriver驅動下載網址是:http://chromedriver.storage.googleapis.com

測試安裝情況:
如果能正常打開百度說明安裝成功

from selenium.webdriver import Chrome
browser = Chrome()
browser.get('https://www.baidu.com')

3. selenium使用xpath定位元素

3.1. 提取數據

使用xpath定位元素是我看到的最簡單也是最快的方法,沒有之一,方法是,在chrome瀏覽器打開某個頁面後,將鼠標放到某個元素(文字,鏈接,圖片等),點擊鼠標右鍵,選擇檢查,即可得到元素所在的html地址。然後我們在右鍵選擇copy xpath即可得到元素的xpath。
得到xpath有什麼用呢?太有用了,有了xpath,可以讓程序獲取xpath的文本信息,圖片信息,超鏈接信息,進一步,模擬鼠標點擊。

# 第1步,打開百度網頁
from selenium.webdriver import Chrome
browser = Chrome()
browser.get('https://www.baidu.com')

# 第2步,獲取xpath地址
# 通過剛纔的方法,我們已經得到`新聞`的xpath
xpath='//*[@id="u1"]/a[1]'

# 第3步,獲取xpath的內容
browser.find_element_by_xpath(xpath).text
# '新聞'

# 獲取超鏈接
browser.find_element_by_xpath(xpath).get_property('href')
# 'http://news.baidu.com/'

如果你還不明白,請看下面兩張圖:
這裏寫圖片描述

這裏寫圖片描述

3.2. 瀏覽器交互

好了,接下來演示如何和瀏覽器交互。還是以剛纔打開的百度網頁爲例,演示如何輸入關鍵字並點擊搜索按鈕.

# 第1步,打開百度網頁
from selenium.webdriver import Chrome
browser = Chrome()
browser.get('https://www.baidu.com')

# 第二步,用前面的方法找到搜索框的xpath,並輸入內容
xpath='//*[@id="kw"]'
browser.find_element_by_xpath(xpath).send_keys('這是一個演示')

# 第三步 ,找到`百度一下`按鈕,並模擬鼠標點擊
xpath='//*[@id="su"]'
browser.find_element_by_xpath(xpath).click()

現在chrome瀏覽器是不是已經出現搜索結果了呢!是不是很方便呢。
用這種方法在模擬登錄是很方便的,完全模擬瀏覽器,不用做什麼瀏覽器頭文件什麼的。
當然這裏沒有用到複雜的session和cookies,如果你有空折騰,selenium也是很簡單的。

3.3. 一些常用的瀏覽器交互

下面說一下一些常用的瀏覽器交互,除了上面的輸入和點擊外,還有一些常用的交互方法,比如滾動,在新標籤頁打開,點擊等。

滾動頁面
爲什麼要滾動頁面呢,因爲有些網頁反爬蟲很厲害,你不能看着第一行的內容卻提取最後一行的內容,特別是在網頁很長很長的情況下。

# 打開瀏覽器
from selenium.webdriver import Chrome
browser = Chrome()

# 第一種,滾動到底部
browser.execute_script(self, 'window.scrollTo(0, document.body.scrollHeight)')

# 第二種,往下滾動50像素
browser.execute_script(self, 'window.scrollTo(0, 50)')

# 第三種,滾動到xpath位置
xpath='xpath you specify'
view = browser.find_element_by_xpath(xpath)
browser.execute_script("arguments[0].scrollIntoView()", view)

在頁面上點擊
這裏說的點擊是隨機點擊,而不是點擊具體的某一個xpath指定的元素。

# 打開瀏覽器
from selenium.webdriver import Chrome
from selenium.webdriver.common.action_chains import ActionChains
browser = Chrome()

# 根據x,y座標點擊頁面
ActionChains(browser).move_by_offset(x, y).context_click()

在新標籤頁打開網頁

from selenium.webdriver import Chrome
browser = Chrome()

browser.execute_script(self, 'window.open("' + url + '")')

3.4. 代理

再爬蟲中不可避免地會提及代理。在selenium中設置代理也很簡單,下面的演示。

from selenium.webdriver import Chrome
from selenium.webdriver import ChromeOptions

# 設置代理參數
chrome_options = ChromeOptions()
chrome_options.add_argument('--proxy-server=http://{proxy_ip}'.format(proxy_ip=proxy_ip))
# 啓動瀏覽器
browser = Chrome()

3.5. headless

headless,簡單說就是不打開瀏覽器指定瀏覽器的相關操作,因爲打開瀏覽器是很好資源的,如果所有的步驟都已經設置好並部署在服務器上,當然是不需要打開瀏覽器啊,相當於後臺運行的意思。

from selenium.webdriver import Chrome
from selenium.webdriver import ChromeOptions

# chrome參數
chrome_options = ChromeOptions()
chrome_options.add_argument('--headless')
# 啓動瀏覽器
browser = Chrome()

3.6. selenium獲取源碼

這個操作是,既然已經打開網頁了,那能不能將網頁的源碼保存下來,然後傳給其他程序處理呢,比如將網頁源碼發給beautifulSoup解析?當時是可以的,就一句話的事情。

# 打開網頁
from selenium.webdriver import Chrome
browser = Chrome()
browser.get('https://www.baidu.com')

# 獲取源碼
html = browser.page_source

4. lxml使用xpath提取數據

selenium很棒是不是,可以你知道嗎,使用selenium操作chrome是很好資源的,而且經常出現chrome瀏覽器在等待網站相應,特別是js響應的時候耗費很多時間最後超時的情況,如果我們不需要特別複雜的操作,只是簡單講網頁下載下來,或者說,對方網站就很簡單,那就沒必要用selenium了,只需要用chrome得到xpath地址,然後用lxml解析即可。

基本步驟是:
- 1.先用chrome瀏覽器獲取元素的xpath
- 2.用request下載網頁
- 3.用lxml解析xpath的元素

還是以百度爲例

from lxml import etree
import requests

# 設置瀏覽器
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) Chrome/50.0.2661.102'}
# 訪問網頁
r = requests.get('https://www.baidu.com/', headers=headers)
# 設置網頁編碼類型,一般不需要,看網站而定
r.encoding = 'utf-8'

# 重點來了,解析網頁,獲取xpath指定的數據
# 這個xpath是通過chrome瀏覽器得到的
html = etree.HTML(r.text)
xpath='//*[@id="u1"]/a[1]'

# 獲取內容
tag=html.xpath(xpath)[0]
tag.text
# 獲取超鏈接
tag.get('href')

5. 後話

好了,暫時先說到這裏,相信你看完這篇文章後也能上手爬蟲了,起碼能爬取90%類型的互聯網網頁信息。
當然,爬蟲也不是隻有這些,反爬機制,動態加載,併發,爬蟲池等等,祝你從入門到放棄。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章