数据采集与清洗基础习题(二)Python爬虫常用模块,头歌参考答案
?數(shù)據(jù)采集習題參考答案,會持續(xù)更新,點個關注防丟失。為了方便查找,已按照頭歌重新排版,朋友們按照頭歌所屬門類查找實訓哦,該篇為Python爬蟲常用模塊。
創(chuàng)作不易,一鍵三連給博主一個支持唄。
文章目錄
實訓一:urllib 爬蟲
第一關:urllib基礎
?第一關答案
第二關:urllib進階
第二關答案
實訓二:requests 爬蟲
第一關:requests 基礎
第一關答案
第二關:requests 進階
第二關答案
實訓一:urllib 爬蟲
讀取 URL、下載網(wǎng)頁是爬蟲必備而且關鍵的功能,需要和 HTTP 請求打交道。而 urllib 是 Python 中的一個功能強大、用于操作 URL 的庫。 本實訓主要介紹如何使用 urllib 庫進行網(wǎng)頁爬取。
第一關:urllib基礎
本關任務:掌握 urlopen 函數(shù)的使用,完成一個簡易的爬取程序。
urlopen函數(shù)
urlopen 函數(shù)是 urllib 模塊下的一個方法,用于實現(xiàn)對目標 url 的訪問。函數(shù)原型如下:
import urllib # 導入urllib包 urllib.request.urlopen(url, data=None, cafile=None, capath=None, cadefault=False, context=None)參數(shù)說明:
- url 參數(shù):統(tǒng)一資源定位符,目標資源在網(wǎng)絡中的位置(如:https://www.xxx.com/);
- data 參數(shù):data 用來指明發(fā)往服務器請求中的額外信息,data 必須是一個字節(jié)數(shù)據(jù)對象,默認為 None;
- cafile、capath、cadefault 參數(shù):用于實現(xiàn)可信任的 CA 證書的 HTTP 請求;
- context 參數(shù):實現(xiàn) SSL 加密傳輸。
urlopen函數(shù)的使用
現(xiàn)在通過訪問百度網(wǎng)站,演示如何使用 urlopen 函數(shù)。代碼如下:
import urllib response = urllib.request.urlopen(url="http://www.baidu.com") # 打開百度網(wǎng)站 print(type(response)) # 打印數(shù)據(jù)類型?第一關答案
import urllib.request def request(url):'''一個參數(shù):param url:請求網(wǎng)址:return:返回一個請求的字符串。編碼為utf-8'''# *************** Begin *************** #r=urllib.request.urlopen(url) return r.read().decode('utf-8')# *************** End ***************** #第二關:urllib進階
本關任務:利用 Opener 方法,完成一個簡易的爬取程序。
Request類
第一關介紹了 urlopen(),它可以實現(xiàn)最基本的請求發(fā)起,但構建還不是一個完整的請求,如果請求中需要加入 headers 等信息,需要利用更強大的 Request 類來構建一個請求。
request 是 urllib 庫的一個重要模塊, 提供了最基本的構造 HTTP 請求的方法,利用它可以模擬瀏覽器的一個請求發(fā)起過程,可以用來發(fā)送 request 和獲取 request 的結果。模擬更真實地 request 請求需要構造 request 類,函數(shù)表達式如下所示:
request=urllib.request.Request(url,data,headers)參數(shù)說明:
- url: 統(tǒng)一資源定位符,這個是必傳參數(shù),其他的都是可選參數(shù);
- data: 傳遞的表單,參數(shù)如果要傳必須傳 bytes (字節(jié)流)類型的;
- headers: 請求頭,參數(shù)是一個字典,包含 cookie,User-Agent 等信息,用于模擬更真實的用戶訪問,是常見的反爬措施之一。
Opener方法?
之前我們學習了如何構造 Request,但是一些更高級的操作,比如 Cookies 處理、代理該怎樣來設置?urllib.request 擁有一些高級特性,這些特性可以做到任何 HTTP 請求中所有的事情。下面演示如何獲取網(wǎng)站的 Cookie。
import http.cookiejar, urllib.request # 導入相關庫 cookie = http.cookiejar.CookieJar() # 創(chuàng)建 CookieJar 對象 handler = urllib.request.HTTPCookieProcessor(cookie) # 利用 HTTPCookieProcessor 來構建一個 handler opener = urllib.request.build_opener(handler) # 利用 build_opener 方法構建出 opener response = opener.open('http://www.baidu.com') # 執(zhí)行 open() # 打印 Cookie for item in cookie:print(item.name+"="+item.value)第二關答案
import urllib.request import http.cookiejar def request(url,headers):'''兩個參數(shù):param url:統(tǒng)一資源定位符,請求網(wǎng)址:param headers:請求頭:return:html'''# ***************** Begin ******************** #cookie = http.cookiejar.CookieJar()handler = urllib.request.HTTPCookieProcessor(cookie) opener = urllib.request.build_opener(handler)r= opener.open(url)# ***************** End ******************** #html = r.read().decode('utf-8')return html實訓二:requests 爬蟲
第一關:requests 基礎
編程要求
根據(jù)提示,在右側(cè)編輯器 Begin-End 區(qū)間補充代碼,完善函數(shù) get_html(),用 requests.get 請求獲取網(wǎng)頁信息。
相關知識
為了完成本關任務,你需要掌握:requests 的安裝和 requests 的常用方法。
requests 的安裝
我們之前介紹了 urllib 庫的使用,它是作為爬蟲入門工具來介紹的,對新手理解 Python 爬蟲的整個流程很有幫助。在掌握了爬蟲基本思想流程后,就需要引入更高級的工具來提高我們的開發(fā)效率,這里就開始給大家介紹 requests 庫的使用。
如果本地 Python 環(huán)境沒有安裝 requests,可以在命令提示符窗口輸入命令pip install requests,安裝 requests 模塊,如下圖所示。
requests 的常用方法
requests 可以用來模擬瀏覽器請求,下面介紹實現(xiàn)方法。以 GET 請求為例,實現(xiàn)代碼如下所示:
res = requests.get(url, params=params, headers=headers)參數(shù)說明:
- url :需要抓取的 URL 地址;
- params : 網(wǎng)址帶參請求的方法,字典類型;
- headers : 請求頭。
以百度搜索為例,現(xiàn)在有這樣一個網(wǎng)址https://www.baidu.com/s?wd=requests,由主要網(wǎng)址 https://www.baidu.com/s 和參數(shù) wd 組成,需要發(fā)起 GET 請求,方法有兩種。
方法一:
import requests # 導包 url = 'https://www.baidu.com/s?wd=requests' header = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/" "537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"} response = requests.get(url, headers=header) #模擬 get 請求 response.encoding = 'utf-8' # 指定編碼 print(response.text) # 打印網(wǎng)頁信息文本方法二:
import requests # 導包 url = 'https://www.baidu.com/s' header = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/" "537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"} params = {'wd': 'requests'} # 定義參數(shù) response = requests.get(url, params=params, headers=header) #模擬 get 請求 response.encoding = 'utf-8' # 指定編碼 print(response.text) # 打印網(wǎng)頁信息文本以上兩種方法,都可以得到同一個網(wǎng)頁的信息??梢钥闯?#xff0c;與 urllib 相比,requests 代碼更加簡潔。
上述代碼還用到了響應對象(response)的屬性,比如response.encoding和response.text,響應對象還有一些其它屬性:
- encoding :響應字符編碼 res.encoding = ‘utf-8’;
- text :字符串,網(wǎng)站源碼;
- content :字節(jié)流,字符串網(wǎng)站源碼;
- status_code :HTTP 響應碼;
- url :實際數(shù)據(jù)的 URL 地址。
接下來演示一下 POST 請求,代碼同樣非常簡潔,實現(xiàn)代碼如下所示:
res = requests.post(url, data=data, headers=headers)參數(shù)說明:
- url :需要抓取的 URL 地址;
- data : 提交常見的 form 表單的方法,字典類型;
- headers : 請求頭。
以豆瓣登錄為例,登錄網(wǎng)址為https://www.douban.com/,但這只是登錄頁面網(wǎng)址。為了找到真正的登錄網(wǎng)址,需要打開開發(fā)者工具,然后在網(wǎng)頁上實際進行登錄操作,在Network項目下,選中文件basic,可以得到 post 請求的網(wǎng)址為https://accounts.douban.com/j/mobile/login/basic,如下圖所示:
如果將上圖的頁面往下拉,可以看到 data 參數(shù)為:
以下代碼演示了模擬登錄的 POST 請求:
import requests # 導包# 模擬請求頭 header = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/" "537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"}# 定義 data 信息 data = { "name": "賬號", "password": "密碼", }url = "https://accounts.douban.com/j/mobile/login/basic" response = requests.post(url=url, headers=header, data=data) # 模擬登錄請求 response.encoding = "utf-8" # 定義編碼 html_content = response.text print(html_content) # 打印網(wǎng)頁信息第一關答案
import requestsdef get_html(url):'''兩個參數(shù):param url:統(tǒng)一資源定位符,請求網(wǎng)址:param headers:請求頭:return:html'''# ***************** Begin ******************** ## 補充請求頭headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/""537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"}# get請求網(wǎng)頁response = requests.get(url=url, headers=headers) # 模擬登錄請求response.encoding = "utf-8" # 定義編碼# 獲取網(wǎng)頁信息文本html = response.text# ***************** End ******************** #return html第二關:requests 進階
編程要求
根據(jù)提示,在右側(cè)編輯器 Begin-End 區(qū)間補充代碼,完善函數(shù) get_html(),使用 requests 創(chuàng)建 session 對指定網(wǎng)址發(fā)出請求。
相關知識
為了完成本關任務,你需要掌握:cookie 與 session 的使用。
cookie的使用
當你瀏覽某網(wǎng)站時,Web 服務器會修改修改你電腦上的 Cookies 文件,它是一個非常小的文本文件,可以記錄你的用戶 ID 、密碼、瀏覽過的網(wǎng)頁、停留的時間等信息。 當你再次來到該網(wǎng)站時,網(wǎng)站通過讀取 Cookies 文件,得知你的相關信息,從而做出相應的動作,如在頁面顯示歡迎你的標語,或者讓你不用輸入 ID、密碼就直接登錄等等。
下面演示如何在 requests 中使用 Cookies, 以百度搜索為例,在開發(fā)者工具查看請求頭信息如下:
方法一 將得到的 Cookies 信息寫入請求頭,模擬 GET 請求:
header = { 'User-Agent': 'Mozilla/5.0 (Linux; Android 8.0.0; Pixel 2 XL Build/OPD1.170816.004) AppleWebKit/' '537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Mobile Safari/537.36', "Cookie": "BAIDUID=53B7CC4BFCDC39D2EF625C13D285429D:FG=1; BIDUPSID=53B7CC4BFCDC39D2EF625C13D285429D; " "PSTM=1591665716; BD_UPN=12314753; BDUSS=2N2ajRYZnI2cVlZN1FRemlWNU9FV1lSZFM3SnZBS0dvRW44WFRCUTRWck1mUVpmR" "VFBQUFBJCQAAAAAAAAAAAEAAAAoKJzNMTIyMzM4ODQ1uNW41QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAMzw3l7M8N5eS; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; sug=3; sugstore=1; ORIGIN=0; bdime=0; " "H_PS_PSSID=1456_31672_32139_31253_32046_32230_31708_32295_26350_22160; delPer=0; BD_CK_SAM=1; PSINO=6; " "H_PS_645EC=3b86vFCd303Aw0wmqvkcAGpfxU4oXfwYcs6jRd1RnxihTsvhfqaVB%2BIoeBs; BDSVRTM=0" }response = requests.get(url=url, headers=header)方法二(不推薦) 也可將 cookie 寫成字典的形式,傳入請求方法中:
cookies = {"BAIDUID": "53B7CC4BFCDC39D2EF625C13D285429D:FG=1", "BIDUPSID": "53B7CC4BFCDC39D2EF625C13D285429D", "PSTM": "1591665716", "BD_UPN": "12314753", "sug": "3", "sugstore": "1", "ORIGIN": "0", "bdime": "0", "H_PS_PSSID": "1456_31672_32139_31253_32046_32230_31708_32295_26350_22160", "delPer": "0", " BD_CK_SAM": "1", "PSINO": "6", "H_PS_645EC": "3b86vFCd303Aw0wmqvkcAGpfxU4oXfwYcs6jRd1RnxihTsvhfqaVB%2BIoeBs", "BDSVRTM": "0", "BDUSS": "2N2ajRYZnI2cVlZN1FRemlWNU9FV1lSZFM3SnZBS0dvRW44WFRCUTRWck1mUVpmRVFBQUFBJCQ" "AAAAAAAAAAAEAAAAoKJzNMTIyMzM4ODQ1uNW41QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMzw3l7M8N5eS; BDORZ=B490B5EBF6F3CD402E515D" "22BCDA1598", }response = requests.get(url=url, headers=header, cookies=cookies)session 的使用
http 協(xié)議是無狀態(tài)的,也就是每個請求都是獨立的。那么登錄后的一系列動作,都需要用 cookie 來驗證身份是否是登錄狀態(tài),為了高效的管理會話,保持會話,于是就有了 session 。 session 是一種管理用戶狀態(tài)和信息的機制,與 cookies 的不同的是,session 的數(shù)據(jù)是保存在服務器端。說的明白點就是 session 相當于一個虛擬的瀏覽器,在這個瀏覽器上處于一種保持登錄的狀態(tài)。
下面演示如何在 requests 中使用 session。 創(chuàng)建會話的代碼如下:
sess = requests.session()使用會話發(fā)出請求提交表單的代碼如下:
data = { "name": "XXXXX", "password": "XXXXX", } header = { 'User-Agent': 'Mozilla/5.0 (Linux; Android 8.0.0; Pixel 2 XL Build/OPD1.170816.004) AppleWebKit/' '537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Mobile Safari/537.36' }response = sess.post(url, headers=header, data=data)登錄成功后,會話會生成 cookie 以及請求頭,再次訪問網(wǎng)站,直接發(fā)出請求即可,代碼如下:
response_home = sess.get(url=url)第二關答案
import requestsdef get_html(url):'''兩個參數(shù):param url:統(tǒng)一資源定位符,請求網(wǎng)址:param headers:請求頭:return html 網(wǎng)頁的源碼:return sess 創(chuàng)建的會話'''# ***************** Begin ******************** ## 補充請求頭headers={ 'User-Agent':'Mozilla/5.0 (Linux; Android 8.0.0; Pixel 2 XL Build/OPD1.170816.004) AppleWebKit/''537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Mobile Safari/537.36',"Cookie":"BAIDUID=53B7CC4BFCDC39D2EF625C13D285429D:FG=1; BIDUPSID=53B7CC4BFCDC39D2EF625C13D285429D; ""PSTM=1591665716; BD_UPN=12314753; BDUSS=2N2ajRYZnI2cVlZN1FRemlWNU9FV1lSZFM3SnZBS0dvRW44WFRCUTRWck1mUVpmR""VFBQUFBJCQAAAAAAAAAAAEAAAAoKJzNMTIyMzM4ODQ1uNW41QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA""AAAAAAAAAAAAMzw3l7M8N5eS; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; sug=3; sugstore=1; ORIGIN=0; bdime=0; ""H_PS_PSSID=1456_31672_32139_31253_32046_32230_31708_32295_26350_22160; delPer=0; BD_CK_SAM=1; PSINO=6; ""H_PS_645EC=3b86vFCd303Aw0wmqvkcAGpfxU4oXfwYcs6jRd1RnxihTsvhfqaVB%2BIoeBs; BDSVRTM=0"}# 創(chuàng)建Session, 并使用Session的get請求網(wǎng)頁sess = requests.session()# 獲取網(wǎng)頁信息文本response = sess.get(url,headers=headers)response_home = sess.get(url=url)html=response.text# ****************** End ********************* #return html, sess在學習中成功、在學習中進步!我們一起學習不放棄~
記得三連哦~?你們的支持是我最大的動力!!歡迎大家閱讀往期文章哈~
小編聯(lián)系方式如下,歡迎各位巨佬溝通交流,代碼什么的加小編私聊哦~
總結
以上是生活随笔為你收集整理的数据采集与清洗基础习题(二)Python爬虫常用模块,头歌参考答案的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 云服务器怎么安装声音驱动_Windows
- 下一篇: vue 拖动 datatransfer