起点中文网越来越火爆了,我利用Python直接把整站数据采集完毕
主要講解爬蟲相關(guān)的知識如:http、網(wǎng)頁、爬蟲法律等,讓大家對爬蟲有了一個比較完善的了解和一些題外的知識點。
今天這篇文章,我們從今天開始就正式進(jìn)入實戰(zhàn)階段,后面將會有更多的實際案例。
為大家講解了HTTP原理,很多人好奇:好好的講爬蟲和HTTP有什么關(guān)系?其實我們常說的爬蟲(也叫網(wǎng)絡(luò)爬蟲)就是使用一些網(wǎng)絡(luò)協(xié)議發(fā)起的網(wǎng)絡(luò)請求,而目前使用最多的網(wǎng)絡(luò)協(xié)議便是HTTP/S網(wǎng)絡(luò)協(xié)議簇。
一、Python有哪些網(wǎng)絡(luò)庫
在真實瀏覽網(wǎng)頁我們是通過鼠標(biāo)點擊網(wǎng)頁然后由瀏覽器幫我們發(fā)起網(wǎng)絡(luò)請求,那在Python中我們又如何發(fā)起網(wǎng)絡(luò)請求的呢?答案當(dāng)然是庫,具體哪些庫?豬哥給大家列一下:
- Python2: httplib、httplib2、urllib、urllib2、urllib3、requests
- Python3: httplib2、urllib、urllib3、requests
Python網(wǎng)絡(luò)請求庫有點多,而且還看見網(wǎng)上還都有用過的,那他們之間有何關(guān)系?又該如何選擇?
- httplib/2:這是一個Python內(nèi)置http庫,但是它是偏于底層的庫,一般不直接用。而httplib2是一個基于httplib的第三方庫,比httplib實現(xiàn)更完整,支持緩存、壓縮等功能。一般這兩個庫都用不到,如果需要自己 封裝網(wǎng)絡(luò)請求可能會需要用到。
- urllib/urllib2/urllib3:urlliib是一個基于httplib的上層庫,而urllib2和urllib3都是第三方庫,urllib2相對于urllib增加一些高級功能,如:HTTP身份驗證或Cookie等,在Python3中將urllib2合并到了urllib中。urllib3提供線程安全連接池和文件post等支持,與urllib及urllib2的關(guān)系不大。
- requests:requests庫是一個基于urllib/3的第三方網(wǎng)絡(luò)庫,它的特點是功能強(qiáng)大,API優(yōu)雅。由上圖我們可以看到,對于http客戶端python官方文檔也推薦我們使用requests庫,實際工作中requests庫也是使用的比較多的庫。最后,如果你的時間不是很緊張,并且又想快速的python提高,最重要的是不怕吃苦,建議你可以架尉?信(同音):2763177065 ,那個真的很不錯,很多人進(jìn)步都很快,需要你不怕吃苦哦!大家可以去添加上看一下~
綜上所述,我們選擇選擇requests庫作為我們爬蟲入門的起點。另外以上的這些庫都是同步網(wǎng)絡(luò)庫,如果需要高并發(fā)請求的話可以使用異步網(wǎng)絡(luò)庫:aiohttp,這個后面豬哥也會為大家講解。
二、requests介紹
**希望大家永遠(yuǎn)記住:學(xué)任何一門語言,都不要忘記去看看官方文檔。**也許官方文檔不是最好的入門教程,但絕對是最新、最全的教學(xué)文檔!
1.首頁
requests的官方文檔(目前已支持中文)
從首頁中讓HTTP服務(wù)人類這幾個字中我們便能看出,requests核心宗旨便是讓用戶使用方便,間接表達(dá)了他們設(shè)計優(yōu)雅的理念。
注:PEP 20便是鼎鼎大名的Python之禪。
警告:非專業(yè)使用其他 HTTP 庫會導(dǎo)致危險的副作用,包括:安全缺陷癥、冗余代碼癥、重新發(fā)明輪子癥、啃文檔癥、抑郁、頭疼、甚至死亡。
2.功能特性
都說requests功能強(qiáng)大,那我們來看看requests到底有哪些功能特性吧:
- Keep-Alive & 連接池
- 國際化域名和 URL
- 帶持久 Cookie 的會話
- 瀏覽器式的 SSL 認(rèn)證
- 自動內(nèi)容解碼
- 基本/摘要式的身份認(rèn)證
- 優(yōu)雅的 key/value Cookie
- 自動解壓
- Unicode 響應(yīng)體
- HTTP(S) 代理支持
- 文件分塊上傳
- 流下載
- 連接超時
- 分塊請求
- 支持 .netrc
requests 完全滿足今日 web 的需求。Requests 支持 Python 2.6—2.7以及3.3—3.7,而且能在 PyPy 下完美運行
三、安裝requests
pip install requests
如果是pip3則使用
pip3 install requests
如果你使用anaconda則可以
conda install requests
如果你不想用命令行,可在pycharm中這樣下載庫
四、爬蟲流程
下圖是豬哥之前工作總結(jié)的一個項目開發(fā)流程,算是比較詳細(xì),在開發(fā)一個大型的項目真的需要這么詳細(xì),不然項目上線出故障或者修改需求都無法做項目復(fù)盤,到時候程序員就有可能背鍋祭天。。。
言歸正傳,給大家看項目的開發(fā)流程是想引出爬蟲爬取數(shù)據(jù)的流程:
起點中文網(wǎng)創(chuàng)建于2002年5月,是國內(nèi)最大文學(xué)閱讀與寫作平臺之一,是國內(nèi)領(lǐng)先的原創(chuàng)文學(xué)門戶網(wǎng)站,隸屬于國內(nèi)最大的數(shù)字內(nèi)容綜合平臺——閱文集團(tuán)旗下。最后,如果你的時間不是很緊張,并且又想快速的python提高,最重要的是不怕吃苦,建議你可以架尉?信(同音):2763177065 ,那個真的很不錯,很多人進(jìn)步都很快,需要你不怕吃苦哦!大家可以去添加上看一下~
總體思路分為三步:
1.分析網(wǎng)頁結(jié)構(gòu),利用xpath表達(dá)式爬取到所有的文章名字與鏈接,并按文章名字生成文件夾。
import requestsfrom urllib import requestfrom lxml import etreeimport osheader = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'}class Spider(object): def start_request(self): url = 'https://www.qidian.com/all' req = request.Request(url,headers=header) html= request.urlopen(req).read().decode('utf-8') html=etree.HTML(html) bigtit_list=html.xpath('//div[@class="book-mid-info"]/h4/a/text()') ##爬取所有的文章名字 bigsrc_list = html.xpath('//div[@class="book-mid-info"]/h4/a/@href') print(bigtit_list) print(bigsrc_list) for bigtit,bigsrc in zip(bigtit_list,bigsrc_list): if os.path.exists(bigtit)==False: os.mkdir(bigtit) self.file_data(bigsrc,bigtit)2.利用文章鏈接,爬取每個章節(jié)名字與鏈接
def file_data(self,bigsrc,bigtit): #詳情頁 url="http:"+bigsrc req = request.Request(url, headers=header) html = request.urlopen(req).read().decode('utf-8') html = etree.HTML(html) print(html) Lit_tit_list = html.xpath('//ul[@class="cf"]/li/a/text()') #爬取每個章節(jié)名字 Lit_href_list = html.xpath('//ul[@class="cf"]/li/a/@href') #每個章節(jié)鏈接 for tit,src in zip(Lit_tit_list,Lit_href_list): self.finally_file(tit,src,bigtit)3.利用每個章節(jié)的鏈接,生成帶有章節(jié)名稱的txt文件,并保存到每個文章文件夾下。
def finally_file(self,tit,src,bigtit): url = "http:" + src req = request.Request(url, headers=header) html = request.urlopen(req).read().decode('utf-8') html = etree.HTML(html) text_list = html.xpath('//div[@class="read-content j_readContent"]/p/text()') text = "\n".join(text_list) file_name = bigtit + "\\" + tit + ".txt" print("正在抓取文章:" + file_name) with open(file_name, 'a', encoding="utf-8") as f: f.write(text)spider=Spider()spider.start_request()成功!
生成的文件夾如下圖:
總結(jié)
以上是生活随笔為你收集整理的起点中文网越来越火爆了,我利用Python直接把整站数据采集完毕的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: scala io实现 获取目下的所有子文
- 下一篇: CrystalReports2007安装