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