python网络爬虫_Python爬虫实战之网络小说
? ? ? ?今天和大家分享的是python爬蟲實(shí)戰(zhàn),由于本人最近迷上了看網(wǎng)絡(luò)小說(shuō),學(xué)生黨又窮,只能看看網(wǎng)絡(luò)dao版小說(shuō),現(xiàn)在這類dao版小說(shuō)網(wǎng)站可以說(shuō)非常的多,但是所有的網(wǎng)站進(jìn)去都可以看見(jiàn)一大把的廣告信息,非常影響我們的閱讀體驗(yàn),所以我打算將dao版小說(shuō)網(wǎng)站的小說(shuō)內(nèi)容通過(guò)學(xué)習(xí)到的python爬蟲技術(shù)爬取下來(lái)搭建自己的小說(shuō)網(wǎng)站,有了今天的這篇文章。
? ? ? 第一步,選取目標(biāo):
? ? ? 對(duì)于目標(biāo)網(wǎng)站的選取,我們作為以為忠實(shí)的小說(shuō)迷,自然要選擇小說(shuō)更新速度快并且訪問(wèn)穩(wěn)定的小說(shuō)網(wǎng)站(dao版)進(jìn)行數(shù)據(jù)爬取。“筆趣閣”作為現(xiàn)代dao版小說(shuō)網(wǎng)站的始祖,我們通過(guò)百度搜索相關(guān)關(guān)鍵詞,找到了目前百度排行第一的“筆趣閣”網(wǎng)站,
? ? ? 小編我只看穿越類型的小說(shuō),所以只選取了穿越類型的小說(shuō)進(jìn)行爬取。在我看來(lái),爬取數(shù)據(jù)最重要的是思路,首先我們要明確我們爬取的思路,還好這種小說(shuō)類型的網(wǎng)站網(wǎng)絡(luò)頁(yè)面都是非常的標(biāo)準(zhǔn)荷統(tǒng)一化,我們的大體思路如下:
? ? ?第二步:爬蟲的編寫
? ? ?根據(jù)我們上面思路,我們需要用到以下模塊:
Requests模塊,用于發(fā)送網(wǎng)絡(luò)請(qǐng)求
Lxml的etree模塊,格式化我們的網(wǎng)頁(yè)數(shù)據(jù),便于我們使用xpath提取網(wǎng)頁(yè)數(shù)據(jù)
Retrying模塊,由于網(wǎng)絡(luò)延遲會(huì)造成我們的數(shù)據(jù)請(qǐng)求失敗,使用retrying模塊來(lái)重新發(fā)送我們的網(wǎng)絡(luò)請(qǐng)求
Tips:XPath即為XML路徑語(yǔ)言(XML Path Language),它是一種用來(lái)確定XML文檔中某部分位置的語(yǔ)言。Xpath教程:https://www.w3school.com.cn/xpath/index.asp,在百度上學(xué)習(xí)了一個(gè)小技巧,使用chrome瀏覽器的開發(fā)者功能,選取目標(biāo)元素,在elements模塊下面右鍵選中的模塊可以直接將該元素的xpath地址復(fù)制出來(lái)。
? ? ? 1. ??????首先創(chuàng)建一個(gè)發(fā)送網(wǎng)絡(luò)請(qǐng)求,返回標(biāo)準(zhǔn)網(wǎng)頁(yè)數(shù)據(jù)的函數(shù)GetUrl,代碼如下:
@retry(stop_max_attempt_number=5)def GetUrl(url): respose = requests.get(url, timeout=5) return etree.HTML(respose.content.decode())#定義一個(gè)獲取URL內(nèi)容,并且返回一個(gè)被lxml模塊格式化標(biāo)準(zhǔn)網(wǎng)頁(yè)數(shù)據(jù)? ? ? 2. ??????定義我們的獲取小說(shuō)列表、小說(shuō)章節(jié)以及章節(jié)內(nèi)容的三個(gè)函數(shù)GetBookList,GetChapterList,GetContent代碼如下:
def GetBookList(url): content = GetUrl(url) booklist = [] bookname = content.xpath("//*[@id='newscontent']/div[1]/ul/li[1]/span[1]/a/text()")[0] print("開始采集《{}》".format(bookname)) for book in content.xpath("//*[@id='newscontent']/div[1]/ul/li"): booklist.append(book.xpath("./span[1]/a/@href")[0]) return booklist#定義一個(gè)獲取小說(shuō)鏈接的函數(shù)def GetChapterList(url): content = GetUrl(url) chapterlist = [] for chapter in content.xpath("//*[@id='list']/dl/dd"): chapterlist.append("http://www.xbiquge.la" + chapter.xpath("./a/@href")[0]) return chapterlist#定義一個(gè)獲取小說(shuō)章節(jié)的函數(shù)def GetContent(url): temp = GetUrl(url) chaptername=temp.xpath("//*[@class='bookname']/h1/text()")[0] content = temp.xpath("//*[@id='content']/text()") str = "" for con in content: str = str + con.replace("\r", "") print(chaptername) return str#定義一個(gè)獲取小說(shuō)章節(jié)內(nèi)容的函數(shù)根據(jù)以上的思路,我們的所有代碼如下圖所示
以上代碼沒(méi)有寫保存函數(shù),大家可以根據(jù)自己的需求把采集下來(lái)的數(shù)據(jù)保存到文本文件或是數(shù)據(jù)庫(kù),我們一保存為txt文本為例:
with open('{}.txt'.format(i), 'wb') as f:f.write(content)? ? 便可按照小說(shuō)的章節(jié)序號(hào)保存
模塊解析
(1)?????Requests模塊:
1. ??????向網(wǎng)站發(fā)送請(qǐng)求:requests.get(url),requests.post(url),可以使用get和post方式向網(wǎng)站發(fā)送請(qǐng)求。如果用用post發(fā)送請(qǐng)求,則配置requests.post(url,data=post請(qǐng)求參數(shù))的形式發(fā)送。
2. ??????可以自定義請(qǐng)求頭信息,requests.get(url,headers=自定義請(qǐng)求頭信息),可以自定義user-agent和cookie信息,來(lái)繞過(guò)網(wǎng)站的反爬手段。
3. ??????返回的響應(yīng)正文不論什么類型,都可以用text獲取。
(2)?????lxml模塊
此次我們運(yùn)用的是lxml模塊當(dāng)中的etree,etree.HTML()可以用來(lái)解析字符串格式的HTML文檔對(duì)象,將傳進(jìn)去的字符串轉(zhuǎn)變成_Element對(duì)象。作為_Element對(duì)象,可以方便的使用getparent()、remove()、xpath()等方法。
(3)?????Retrying模塊
我們?cè)趯懪老x的過(guò)程中,經(jīng)常遇到爬取失敗的情況,這個(gè)時(shí)候我們一般會(huì)通過(guò)try塊去進(jìn)行重試,但是每次都寫那么一堆try塊,真的是太麻煩,所以我們用到retrying模塊,被修飾的函數(shù)執(zhí)行失敗會(huì)自動(dòng)重新執(zhí)行。
stop_max_attempt_number:最大重試次數(shù),超過(guò)這個(gè)次數(shù)會(huì)停止重試,并報(bào)異常。
wait_random_min:隨機(jī)等待最小時(shí)間。
wait_random_max:隨機(jī)等待最大時(shí)間。
第三,軟件的實(shí)際運(yùn)行:
爬蟲運(yùn)行效果截圖
? ? ?本來(lái)可以一直開著我們的腳本在后臺(tái)運(yùn)行,但是運(yùn)行一會(huì)兒我們發(fā)現(xiàn)腳本就報(bào)錯(cuò)停止了,研究了一番我們才發(fā)現(xiàn)由于對(duì)方訪問(wèn)有IP過(guò)濾的反爬措施,所以這里我們需要將我們的爬蟲加入自動(dòng)切換代理IP的功能。我們的requests模塊支持代理功能,在網(wǎng)上找找?guī)讉€(gè)代理,按照如下方式加入我們的代理到爬蟲代碼當(dāng)中:
proxy_dict = { "http": "http://username:password@hogehoge.proxy.jp:8080/", "https": "http://username:password@hogehoge.proxy.jp:8080/"}#引入我們爬蟲程序需要使用的模塊@retry(stop_max_attempt_number=5)def GetUrl(url): respose = requests.get(url, timeout=5,proxies=proxy_dict) return etree.HTML(respose.content.decode())? ? ? 至此我們的小說(shuō)爬蟲便可以一直在電腦上運(yùn)行了,今天的分享也到此結(jié)束,由于是爬蟲新手,文章中有錯(cuò)誤的地方也希望大家指出和諒解,謝謝大家。
本期作者:汪蘇彬
總結(jié)
以上是生活随笔為你收集整理的python网络爬虫_Python爬虫实战之网络小说的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 存钱去邮政还是信用社?存哪个更划算
- 下一篇: python文件函数_python文件和