python网络爬虫_Python爬虫实战之网络小说
? ? ? ?今天和大家分享的是python爬蟲實戰,由于本人最近迷上了看網絡小說,學生黨又窮,只能看看網絡dao版小說,現在這類dao版小說網站可以說非常的多,但是所有的網站進去都可以看見一大把的廣告信息,非常影響我們的閱讀體驗,所以我打算將dao版小說網站的小說內容通過學習到的python爬蟲技術爬取下來搭建自己的小說網站,有了今天的這篇文章。
? ? ? 第一步,選取目標:
? ? ? 對于目標網站的選取,我們作為以為忠實的小說迷,自然要選擇小說更新速度快并且訪問穩定的小說網站(dao版)進行數據爬取?!肮P趣閣”作為現代dao版小說網站的始祖,我們通過百度搜索相關關鍵詞,找到了目前百度排行第一的“筆趣閣”網站,
? ? ? 小編我只看穿越類型的小說,所以只選取了穿越類型的小說進行爬取。在我看來,爬取數據最重要的是思路,首先我們要明確我們爬取的思路,還好這種小說類型的網站網絡頁面都是非常的標準荷統一化,我們的大體思路如下:
? ? ?第二步:爬蟲的編寫
? ? ?根據我們上面思路,我們需要用到以下模塊:
Requests模塊,用于發送網絡請求
Lxml的etree模塊,格式化我們的網頁數據,便于我們使用xpath提取網頁數據
Retrying模塊,由于網絡延遲會造成我們的數據請求失敗,使用retrying模塊來重新發送我們的網絡請求
Tips:XPath即為XML路徑語言(XML Path Language),它是一種用來確定XML文檔中某部分位置的語言。Xpath教程:https://www.w3school.com.cn/xpath/index.asp,在百度上學習了一個小技巧,使用chrome瀏覽器的開發者功能,選取目標元素,在elements模塊下面右鍵選中的模塊可以直接將該元素的xpath地址復制出來。
? ? ? 1. ??????首先創建一個發送網絡請求,返回標準網頁數據的函數GetUrl,代碼如下:
@retry(stop_max_attempt_number=5)def GetUrl(url): respose = requests.get(url, timeout=5) return etree.HTML(respose.content.decode())#定義一個獲取URL內容,并且返回一個被lxml模塊格式化標準網頁數據? ? ? 2. ??????定義我們的獲取小說列表、小說章節以及章節內容的三個函數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#定義一個獲取小說鏈接的函數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#定義一個獲取小說章節的函數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#定義一個獲取小說章節內容的函數根據以上的思路,我們的所有代碼如下圖所示
以上代碼沒有寫保存函數,大家可以根據自己的需求把采集下來的數據保存到文本文件或是數據庫,我們一保存為txt文本為例:
with open('{}.txt'.format(i), 'wb') as f:f.write(content)? ? 便可按照小說的章節序號保存
模塊解析
(1)?????Requests模塊:
1. ??????向網站發送請求:requests.get(url),requests.post(url),可以使用get和post方式向網站發送請求。如果用用post發送請求,則配置requests.post(url,data=post請求參數)的形式發送。
2. ??????可以自定義請求頭信息,requests.get(url,headers=自定義請求頭信息),可以自定義user-agent和cookie信息,來繞過網站的反爬手段。
3. ??????返回的響應正文不論什么類型,都可以用text獲取。
(2)?????lxml模塊
此次我們運用的是lxml模塊當中的etree,etree.HTML()可以用來解析字符串格式的HTML文檔對象,將傳進去的字符串轉變成_Element對象。作為_Element對象,可以方便的使用getparent()、remove()、xpath()等方法。
(3)?????Retrying模塊
我們在寫爬蟲的過程中,經常遇到爬取失敗的情況,這個時候我們一般會通過try塊去進行重試,但是每次都寫那么一堆try塊,真的是太麻煩,所以我們用到retrying模塊,被修飾的函數執行失敗會自動重新執行。
stop_max_attempt_number:最大重試次數,超過這個次數會停止重試,并報異常。
wait_random_min:隨機等待最小時間。
wait_random_max:隨機等待最大時間。
第三,軟件的實際運行:
爬蟲運行效果截圖
? ? ?本來可以一直開著我們的腳本在后臺運行,但是運行一會兒我們發現腳本就報錯停止了,研究了一番我們才發現由于對方訪問有IP過濾的反爬措施,所以這里我們需要將我們的爬蟲加入自動切換代理IP的功能。我們的requests模塊支持代理功能,在網上找找幾個代理,按照如下方式加入我們的代理到爬蟲代碼當中:
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())? ? ? 至此我們的小說爬蟲便可以一直在電腦上運行了,今天的分享也到此結束,由于是爬蟲新手,文章中有錯誤的地方也希望大家指出和諒解,謝謝大家。
本期作者:汪蘇彬
總結
以上是生活随笔為你收集整理的python网络爬虫_Python爬虫实战之网络小说的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 存钱去邮政还是信用社?存哪个更划算
- 下一篇: 比亚迪唐DM-P核心性能升级:充电仅20