《Python網絡爬蟲技術》讀書筆記1

使用Selenium爬取動態網頁

部署Selenium

請參考:
python+selenium 安裝及部署

簡答使用Selenium

打開一個網站後,在新開一個tab打開另外一個網站

#!/usr/bin/env python
# encoding: utf-8

import time
from selenium import webdriver

browser = webdriver.Chrome()
browser.get('http://www.ptpress.com.cn/search/books')
browser.execute_script('window.open()')
print(browser.window_handles)
browser.switch_to_window(browser.window_handles[1])
browser.get('http://www.tipdm.com')
time.sleep(1)
browser.switch_to_window(browser.window_handles[0])
browser.get('http://www.tipdm.org')

頁面等待

Selenium Webdriver提供兩種類型的等待——隱式和顯式。顯式的等待使網絡驅動程序在繼續執行之前等待某個條件的發生。隱式的等待使WebDriver在嘗試定位一個元素時,在一定的時間內輪詢DOM

元素選取

在頁面中定位元素有多種策略。Selenium庫提供瞭如表所示的方法來定位頁面中的元素,使用find_element進行元素選取。在單元素查找中使用到了通過元素ID進行定位、通過XPath表達式進行定位、通過CSS選擇器進行定位等操作。在多元素查找中使用到了通過CSS選擇器進行定位等操作

在這裏插入圖片描述

頁面操作

填充表單

首先打開目標網頁http://www.ptpress.com.cn/search/books,在chrome的F12中,按到對應元素的selector,這樣才能在Selenium中進行操作

在這裏插入圖片描述

#!/usr/bin/env python
# encoding: utf-8

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

driver = webdriver.Chrome()
driver.get('http://www.ptpress.com.cn/search/books')
wait = WebDriverWait(driver, 10)
# 等待確認按鈕加載完成
confirm_btn = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#app > div:nth-child(1) > div > div > div > button > i')))
# 填入文本框內容
search_text = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#searchVal')))
# 填入文本框內容
search_text.send_keys("zengraoli")
# 單擊搜索
confirm_btn.click()

效果如下

在這裏插入圖片描述

執行JavaScript

Selenium庫中的execute_script方法能夠直接調用JavaScript方法來實現翻頁到底部、彈框等操作。比如在“http://www.ptpress.com.cn/search/books”網頁中通過JavaScript翻到頁面底部,並彈框提示爬蟲

示例代碼如下

#!/usr/bin/env python
# encoding: utf-8

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait

driver = webdriver.Chrome()
driver.get('http://www.ptpress.com.cn/search/books')
wait = WebDriverWait(driver, 10)
driver.execute_script('window.scrollTo(0, document.body.scrollHeight)')
driver.execute_script('alert("python爬蟲")')

在這裏插入圖片描述

模擬登陸

簡單的處理驗證碼

如果遇到輸入驗證碼的登錄,模擬登陸的思路大概爲,通過找到驗證碼的圖片,用PIL庫顯示出來,人工進行輸入,再去提交處理

下面的代碼實現了,獲取驗證碼的圖片然後進行顯示

#!/usr/bin/env python
# encoding: utf-8

import requests                                   # 導入Requests庫
from PIL import Image                             # 導入PIL庫的Image模塊

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) Chrome/65.0.3325.181'}
captcha_url = 'http://www.tipdm.org/captcha.svl'
response = requests.get(captcha_url, headers=headers)
with open('captcha.gif', 'wb') as f:
	f.write(response.content)
im = Image.open('captcha.gif')                        # 創建image對象
im.show()                                        # 顯示圖片,會在電腦上自動彈出
captcha = input('請輸入驗證碼: ')
print(captcha)

顯示的驗證碼如下

在這裏插入圖片描述

代理

每次輸入驗證碼會比較麻煩,效率低下。而且當網站服務器多次對指定IP彈出驗證碼後,可能會封禁該IP,導致爬取無法進行。因此,使用代理IP的方法,使用多個IP切換跳過驗證碼,成爲應對反爬蟲的主要手段

獲取代理IP的三種方式

  • VPN:是Virtual Private Network的簡稱,指專用虛擬網絡。國內外很多廠商都提供VPN服務,可自動更換IP,實時性高,速度快,但價格較高,適合商用
  • IP代理池:指大量IP地址集。國內外很多廠商將IP做成代理池,提供API接口,允許用戶使用程序調用,但價格也較高
  • ADSL寬帶撥號:是一種寬帶上網方式。特點是斷開重連會更換IP,爬蟲使用這個原理更換IP,但效率低,實時性差

使用Requests庫配置代理IP

Requests庫爲各個發送請求的函數(get、post、put等)配置代理IP的參數是proxies,它接收dict。爲保障安全性,一些代理服務器設置了用戶名和密碼,使用它的IP時需要帶上用戶名和密碼,IP地址的基本格式如下

http://用戶名:密碼@服務器地址

一個示例

#!/usr/bin/env python
# encoding: utf-8

import requests

proxies = {'http': 'http://zeng:[email protected]:808'}
r = requests.get("http://www.tipdm.org", proxies=proxies)
print(r.status_code)

輸入輸出200即爲訪問成功

用post方式進行登陸

這是普通的方法,直接進行提交

#!/usr/bin/env python
# encoding: utf-8

import requests

data = {'username': 'pc2019', 'password': 'pc2019', 'captcha': 'begv'}
r = requests.post('http://www.tipdm.org/login.jspx', data=data)
print(r) # <Response [200]>,雖然200,但是不會有正確數據,因爲驗證碼肯定是不對的

使用cookie

Cookie用於服務器端識別客戶端,當發送請求的客戶端享有同樣的Cookie時,即可認定客戶端是同一個。Requests庫的會話對象Session能夠跨請求地保持某些參數,比如Cookie,它令發送請求的客戶端享有相同的Cookie,保證表單數據的匹配

data = {'username': 'pc2019','password':'pc2019','captcha':'begv'}
s = requests.session()
r = s.post('http://www.tipdm.org/login.jspx', data=data)
print(r)

一個綜合的例子

結合上面的代碼,用post進行登錄後拿到cookie保存到文件中,再用這個cookie去訪問會員中心,查看是否能正常使用cookie

#!/usr/bin/env python
# encoding: utf-8

import requests
from PIL import Image
# 導入cookiejar模塊
from http import cookiejar

s = requests.Session()
# 創建LWPCookieJar對象,若Cookie不存在建立Cookie文件,命名爲cookie
s.cookies = cookiejar.LWPCookieJar('cookie')

login_url = 'http://www.tipdm.org/login.jspx'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) Chrome/65.0.3325.181'}

def get_captcha():
    captcha_url = 'http://www.tipdm.org/captcha.svl'
    response = s.get(captcha_url, headers=headers)
    with open('captcha.gif', 'wb') as f:
        f.write(response.content)
    im = Image.open('captcha.gif')
    im.show()
    captcha = input('請輸入驗證碼: ')
    return captcha

login_data = {'username': 'pc2019', 'password': 'pc2019', 'captcha': get_captcha()}
r = s.post(login_url, data=login_data, headers=headers)

# 測試是否成功登陸
print('發送請求後返回的網址爲:', r.url)

# 保存cookie
s.cookies.save(ignore_discard=True, ignore_expires=True)

try:
    s.cookies.load(ignore_discard=True) # 加載保存的cookie文件
except:
    print('Cookie 未能加載!')

# 攜帶Cookie提交請求
member_center_url = "http://www.tipdm.org/member/index.jspx"
r = s.get(member_center_url, headers=headers)

# 測試是否成功登陸
print('發送請求後返回的網址爲:', r.text) # 是否輸出會員信息

終端協議分析

分析app抓包

設置Fiddler工具

打開fiddler的tools,選擇options,選中“Decrypt HTTPS traffic”,Fiddler即可截獲HTTPS請求,如下圖所示

在這裏插入圖片描述

切換至“Connections”選項卡,選中“Allow remote computers to connect”,表示允許遠程設備將HTTP/HTTPS請求發送到Fiddler,如下圖所示。此處默認的端口號是8888,可以根據需求更改,但是需注意不能與已使用的端口衝突

在這裏插入圖片描述

設置Android系統的手機

訪問pc的ip:8888,下載證書,完成後設置wifi的代理爲pc的ip,端口爲8888

在這裏插入圖片描述

打開對應的app

打開人民日報手機APP,在Fiddler工具的左側欄找到人民日報APP的信息,每個Fiddler工具抓取到的數據包都會在該列表中展示,單擊具體的一條數據包後,可以在右側菜單上單擊“Insepector”按鈕查看數據包的詳細內容。Fiddler工具的右側欄主要分爲請求信息(即客戶端發出的數據)和響應信息(服務器返回的數據)兩部分。在請求信息上,單擊“Raw”按鈕(顯示Headers和Body數據),在響應信息單擊“JSON”(若請求或響應數據是json格式,以json形式顯示請求或響應內容),如下圖所示

在這裏插入圖片描述

在Fiddler中得到GET請求的URL地址後,Chrome瀏覽器需要下載JSON-handle插件,才能看到返回的JSON格式的信息

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