什么是requests模塊,?
之前我們學(xué)習(xí)過(guò)python內(nèi)置的網(wǎng)絡(luò)請(qǐng)求庫(kù)urllib,,使用起來(lái)流程比較復(fù)雜,。requests模塊對(duì)urllib做了完美封裝,,幾乎包括了所有的urllib功能,而且使用起來(lái)簡(jiǎn)潔方便,,目前被廣泛使用,。
requests庫(kù)常用的方法
最常用的方法為get()和post()分別用于發(fā)送get請(qǐng)求和post請(qǐng)求。
get請(qǐng)求語(yǔ)法結(jié)構(gòu):
requests.get(url, params=None)
參數(shù)說(shuō)明:
url:需要爬取的網(wǎng)站的網(wǎng)址 params:請(qǐng)求參數(shù)
該方法的結(jié)果為Response對(duì)象,,包含服務(wù)器的響應(yīng)信息,。
response對(duì)象的常用屬性:
post請(qǐng)求語(yǔ)法結(jié)構(gòu):
requests.post( url, data=None)
參數(shù)說(shuō)明:
url:需要爬取的網(wǎng)站的網(wǎng)址 data:請(qǐng)求數(shù)據(jù)
正則表達(dá)解析數(shù)據(jù)
項(xiàng)目目標(biāo):爬取博客平臺(tái)所有文章標(biāo)題。
先分析單獨(dú)一篇文章,,文章頁(yè)面url是有規(guī)律的,,目前71號(hào)是我當(dāng)前最后一篇,起始是第1篇,。
import requestsimport re url = "http://blog./blog/detail/71/"response = requests.get(url) # print(response.text) title = re.findall("<h3 class=\"arc-title index-title\">(.*)</h3>", response.text)print(title[0]) # 輸出:什么是網(wǎng)絡(luò)爬蟲(chóng),?自動(dòng)采集互聯(lián)網(wǎng)信息
進(jìn)一步地,循環(huán)獲取所有文章標(biāo)題:
import requestsimport re titles = []for i in range(1, 72): url = "http://blog./blog/detail/" + str(i); response = requests.get(url) title = re.findall("<h3 class=\"arc-title index-title\">(.*)</h3>", response.text) title.insert(0, i) # print(title[0]) titles.append(title)print(titles)
[[1, '棧,,先進(jìn)后出的數(shù)據(jù)結(jié)構(gòu) '], [2, 'CCF CSP-J 2022 第二輪認(rèn)證試題解析 '], [3, 'Nginx簡(jiǎn)明教程 '], [4, 'Docker輕量級(jí)虛擬化,,鏡像和容器 '], [5, '青島大學(xué)開(kāi)源OJ在線測(cè)評(píng)環(huán)境搭建 '], [6, 'Nodejs后端運(yùn)行和javascript刷題 '], [7, '莫比烏斯反演 '], [8, 'Python OpenCV簡(jiǎn)介和圖像灰度處理 '], [9, '什么是C++編程 '], [10, 'C++變量,存儲(chǔ)數(shù)據(jù)的容器 '], [11, 'C++輸入輸出流 '], [12, 'Dev C++安裝配置 '], [13, '計(jì)算機(jī)基礎(chǔ)知識(shí) '], [14, 'C++標(biāo)準(zhǔn)數(shù)據(jù)類(lèi)型 '], [15, 'C++設(shè)置域?qū)?、保留小?shù)位數(shù)和cmath數(shù)學(xué)庫(kù) '], [16, 'C++語(yǔ)法階段課程總結(jié) 2022.11.24 '], [17], [18, 'Linux簡(jiǎn)介和云服務(wù)器配置 '], [19, 'Linux命令行操作 '], [20, 'Vim編輯器之神 '], [21, 'tmux終端復(fù)用器 '], [22, 'Linux用戶(hù)和用戶(hù)組 '], [23, 'Numpy簡(jiǎn)介和數(shù)據(jù)類(lèi)型 '], [24, 'Numpy數(shù)組屬性和數(shù)組創(chuàng)建 '], [25, 'SSH遠(yuǎn)程登錄 '], [26, 'Linux文件權(quán)限設(shè)置 '], [27, 'Ubuntu軟件安裝和卸載 '], [28, 'Opencv圖像二值化處理 '], [29, 'C++格式化輸入輸出 '], [30, 'C++語(yǔ)法系列 '], [31, '趣學(xué)C++編程 '], [32, 'Shell腳本和變量 '], [33, 'Numpy切片,、索引 廣播和迭代 '], [34, 'Opencv圖像降噪 '], [35, 'Python Opencv繪制圖形和文字 '], [36, 'Python opencv 人臉識(shí)別 '], [37, 'Opencv調(diào)取攝像頭拍照和從多媒體文件讀取視頻幀 '], [38, 'Shell test命令和條件判斷 '], [39, 'Shell循環(huán)結(jié)構(gòu) '], [40, 'Shell函數(shù) '], [41, 'Shell正則表達(dá)式 '], [42, 'Shell三劍客之sed '], [43, 'Linux深入淺出 '], [44, 'Shell三劍客之a(chǎn)wk '], [45, '計(jì)算機(jī)網(wǎng)絡(luò)發(fā)展史和網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu) '], [46, '什么是計(jì)算機(jī)網(wǎng)絡(luò)OSI模型和TCP/IP模型? '], [47, '計(jì)算機(jī)網(wǎng)絡(luò)奈奎斯特定理和香農(nóng)定理 '], [48, '計(jì)算機(jī)網(wǎng)絡(luò)IP地址和子網(wǎng)掩碼 '], [49, '計(jì)算機(jī)網(wǎng)絡(luò)TCP/UDP協(xié)議,,三次握手原理 '], [50, '計(jì)算機(jī)網(wǎng)絡(luò)應(yīng)用層體系結(jié)構(gòu) '], [51, '防火墻是什么墻,? '], [52, '什么是計(jì)劃任務(wù)?讓計(jì)算機(jī)定時(shí)執(zhí)行特定任務(wù) '], [53, 'Linux操作系統(tǒng)進(jìn)程管理 '], [54, '通過(guò)Github,,免費(fèi)搭建自己的博客項(xiàng)目 '], [55, 'Github全球最大的程序員交友網(wǎng)站 '], [56, 'git版本創(chuàng)建與回退 '], [57, 'git分支管理,,平行宇宙中的代碼合并 '], [58, '一文詳解HTML和CSS '], [59, 'Javascript基礎(chǔ)入門(mén) '], [60, 'Javascript在線刷題輸入輸出模板 '], [61, '音樂(lè)項(xiàng)目-人臉識(shí)別登錄 '], [62, 'JavaScript點(diǎn)擊按鈕控制圖片切換 '], [63, 'Docker搭建倉(cāng)庫(kù)和數(shù)據(jù)卷管理 '], [64, 'Javascript獲取className屬性和slice切片 '], [65, 'Javascript定時(shí)器 '], [66, 'DOSBox配置8086CPU匯編語(yǔ)言開(kāi)發(fā)環(huán)境 '], [67, 'Javascript對(duì)象和選項(xiàng)卡 '], [68, 'Javascript輪播圖 '], [69, 'Javascript正則表達(dá)式 '], [70, 'Javascript鼠標(biāo)事件和拖拽原理 '], [71, '什么是網(wǎng)絡(luò)爬蟲(chóng)?自動(dòng)采集互聯(lián)網(wǎng)信息 ']]
下面,我們將得到的數(shù)據(jù)保存到本地文件,。
csv文件
csv是一種逗號(hào)分隔值文件格式,。
向CSV文件中寫(xiě)入數(shù)據(jù):
引入csv模塊
使用open()函數(shù)創(chuàng)建 csv文件
借助csv.write()函數(shù)創(chuàng)建writer對(duì)象
調(diào)用writer對(duì)象的writerow()方法寫(xiě)入一行數(shù)據(jù)
調(diào)用writer對(duì)象的writerows()方法寫(xiě)入多行數(shù)據(jù)
import csv with open('data.csv', 'w', newline='') as f: writer = csv.writer(f) writer.writerow([1, "100塊如何花一周"]) writer.writerow([2, "如何上班時(shí)間高效摸魚(yú)"]) li = [ [3, "如何一天賺到100萬(wàn)"], [4, "從易經(jīng)到股市, 我的財(cái)富自由之路"], [5, "跟黑貓一起學(xué)編程"] ] writer.writerows(li)
從CSV文件中讀取數(shù)據(jù):
引入csv模塊
使用open()函數(shù)打開(kāi)CSV文件
借助csv.reader()函數(shù)創(chuàng)建reader對(duì)象
讀到的每一行都是一個(gè)列表(list)
import csvwith open('data.csv', 'r') as f: reader = csv.reader(f) # print(reader) for row in reader: print(row)
數(shù)據(jù)保存
將獲取到的博客所有文章標(biāo)題直接存儲(chǔ)到csv文件:
with open('data.csv', 'w', newline='') as f: writer = csv.writer(f) writer.writerows(titles)
這樣,就實(shí)現(xiàn)了數(shù)據(jù)爬取,、解析和存儲(chǔ)的流程,。
百度貼吧
在貼吧中輸入要搜索的信息,比如“python”,,就會(huì)出現(xiàn)很多python吧,在最下方有翻頁(yè)按鈕,,點(diǎn)擊第2頁(yè),,觀察url,主要信息是“kw=python”和“pn=50”,,第3頁(yè)“pn=100”
面向?qū)ο蟮慕鉀Q方案:下載某貼吧a→b頁(yè)的html頁(yè)面到本地目錄,。
import requestsclass TiebaSpider: def __init__(self, name, start_page, end_page): self.name = name self.start_page = start_page self.end_page = end_page self.headers = { "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv2.0.1) Gecko/20100101 Firefox/4.0.1" } self.rawURL = "https://tieba.baidu.com/f?kw=" + self.name + "&ie=utf-8&pn={}" def load_page(self, page_num): fullURL = self.rawURL.format((page_num-1)*50) result = requests.get(fullURL, headers=self.headers) return result.text def save_page(self, page_num): file_name = "{}吧 第{}頁(yè).html".format(self.name, page_num) result = self.load_page(page_num) with open(file_name, "w", encoding="utf8") as f: f.write(result) def run(self): for page_num in range(self.start_page, self.end_page+1): self.save_page(page_num)if __name__ == "__main__": tieba_spider = TiebaSpider("python", 3, 6) tieba_spider.run()