1. 程式人生 > >python爬蟲——40行程式碼爬取「筆趣看」全部小說 你都看了嗎?

python爬蟲——40行程式碼爬取「筆趣看」全部小說 你都看了嗎?

需求分析

”筆趣看“ 是一個盜版小說網站,這裡有各大知名小說網站的小說,更新速度略慢於正版網站。但是該網站只支援線上瀏覽,不支援小說下載,對於想要下載下來以防斷網或者網速不好時也能看的童鞋來說不太友好。因此,本次練習將爬取該網站所有小說。PS:本次練習僅為學習交流,請各位童鞋支援正版。

爬取目標

本次練習將爬取 “筆趣看” 你想要的任何小說。

準備工作

本次練習將使用 requests 庫(python使用最多的庫)作者 kennethreitz 今年最新力作 request_html 庫。集網頁抓取與解析於一體。想了解更多的可以關注我,我將準備將相關文件翻譯並與現有庫進行對比。

請確保電腦安裝了 python3.6 和requests_html。(具體安裝方法請自行百度)

爬取分析

我們先隨便找一本小說的第一章內容進行分析。


在這裡還是要推薦下我自己建的Python開發學習群:515267276,群裡都是學Python開發的,如果你正在學習Python ,小編歡迎你加入,大家都是軟體開發黨,不定期分享乾貨(只有Python軟體開發相關的),包括我自己整理的一份2018最新的Python進階資料和高階開發教程,歡迎進階中和進想深入Python的小夥伴

第一章內容

用程式碼獲取全部文字資訊:from requests_html import HTMLSessionurl = 'http://www.biqukan.com/53_53276/20760231.html'session = HTMLSession()res = session.get(url)content = res.html.textprint(content)

列印內容如下:


網頁內容

可以看到我們很輕鬆就獲取到所有文字資訊。但是有很多資訊是我們不需要的,所以我們需要更精確的定位,獲取指定資訊。

通過谷歌瀏覽器的開發者工具(按F12)可以發現小說正文全在

標籤下的文字資訊中。因此我們可以通過res.html.find('#content')來定位(定位方法與 jQuery 選擇器一致,對 jQuery 不太熟悉的朋友可以通過‘菜鳥教程’大致瞭解下),這裡我們選擇的是通過 id 定位,當然也可以通過 class 定位(res.html.find('.showtxt')),但是 html 中 id 是唯一的,class 不一定是唯一的,有時會造成定位不準。有 id 建議用 id。改進後的程式碼如下:from requests_html import HTMLSessionurl = 'http://www.biqukan.com/53_53276/20760231.html'session = HTMLSession()res = session.get(url)targets = res.html.find('#content')content = targets[0].textprint(content)
列印結果為:


改進後的結果

可以看到我們獲取的全是小說正文內容。下面讓我們回到該小說主頁。


小說主頁

可以看到前面12章全是最新章節,不是我們需要的,後面的正問卷才是所有章節資訊。

下面我們來分析該頁面資訊:


章節資訊

我們發現所有章節資訊在

下的自定義列表
中。接下來我們來獲取章節名和每章的連結。from requests_html import HTMLSessionfirst_url = 'http://www.biqukan.com'target_url = 'http://www.biqukan.com/53_53276/'session = HTMLSession()res = session.get(target_url)targets = res.html.find('.listmain dd')titles = []hrefs = []for i in range(12, len(targets)): titles.append(targets[i].text) hrefs.extend(list(targets[i].links))print(titles)print(hrefs)
列印結果為:


章節資訊

可以看到我們獲取的章節所有資訊。我們可以將上節程式碼中的 first_url 和 hrefs 中的每個元素進行拼接就能獲得每章的正文網址。完整程式碼

# -*- coding:UTF-8 -*-from requests_html import HTMLSessiondef parse_html(res): targets = res.html.find('.listmain dd') titles = [] hrefs = [] for i in range(12, len(targets)): titles.append(targets[i].text) hrefs.extend(list(targets[i].links)) return titles, hrefsdef get_onepage(first_url, title, href, session, book_name): url = first_url + href res = session.get(url=url) targets = res.html.find('#content') content = targets[0].text with open(book_name + '.txt', 'a', encoding='utf-8') as f: f.write(' ' + title + ' ') f.write(content)def main(): first_url = 'http://www.biqukan.com' session = HTMLSession() targets_url = input('請輸入你要下載的小說地址:') res = session.get(url=targets_url) book_name = res.html.find('.info h2')[0].text titles, hrefs = parse_html(res) for i in range(len(titles)): get_onepage(first_url, titles[i], hrefs[i], session, book_name)if __name__ == '__main__': main()

注意:上述程式碼在 pycharm 上執行時,當你將網址複製到下面提示框按回車鍵時會直接跳到對應網頁。解決辦法有兩個:

1:直接在命令列執行

2:將url = input('請輸入要下載的文庫URL地址_')改成url = input('請輸入要下載的文庫URL地址_'[:-1],在複製的網址後面加一個 感嘆號,eg:http://www.biqukan.com/53_53276/!

總結

本次練習我們是先獲取一章的資訊,然後獲取所有章節資訊,進而獲取所有資訊。

注意:本次練習僅為學習交流,請大家支援正版,畢竟大家寫小說不容易,不是每個人都能成為大神,大家都要吃飯,你的一個訂閱,一次購買就是支援他們前進的動力。如果覺得我的文章對您有所幫助的可以點個關注。最近我的文章可以使用讚賞了,有錢的土豪可以讚賞支援一下,畢竟寫作不易,尤其是原創。