爬蟲-使用Python3爬取360DOC文檔
tags:
Python3、爬蟲、網頁、requests、re、正則表達式問題描述
瀏覽網頁的時候遇到這篇筆記:
http://www.360doc.com/content/07/0310/18/17841_392130.shtml,想要把頁面上的書籍全下載下來,一共有80多本,手動點擊下載太慢,想要快速批量地把下載鏈接爬取下來,於是用Python寫了一個小程序。爬蟲設計
- 先用requests爬取頁面內容,
- 再用re抽取書名和下載鏈接,
- 將結果保存到pandas.DataFrame,
- 最後保存至csv文件
爬取步驟
1、頁面抓取
2、正則表達式解析3、保存到csv文件4、下載電子書文件1、頁面抓取
requests 是Python3里十分好用的網頁爬取解析庫,較之內置的urllib2使用起來要方便得多,而且Python3開始已經不支持urllib2了,在這裡我使用的是Python 3.5。
Requests is an elegant and simple HTTP library for Python, built for human beings.
一點使用入門:
使用requests解析網頁內容十分簡單:
* 使用GET方式獲取網頁:r = requests.get(https://api.github.com/events)
- 使用POST方式獲取網頁:
r = requests.post(http://httpbin.org/post, data = {key:value})
在上面兩個示例中,我們嘗試使用requests獲取github上的某些信息,讀取網頁內容使用:
r.text
返回的HTTPResponse對象r
具有的屬性參照下表:
|屬性名|結果|
|:---|:-----:||text |HTTP字元||encoding| 響應編碼,這個值可以改變,改變之後text屬性也會根據編碼而變化||content |未編碼的二進位數據||json() |返回JSON數據||raw |結果的原始位元組流||url| 請求的URL||status_code| 狀態碼||headers| 請求頭字典||cookies |cookies字典|
|history |如果發生重定向,所有請求對象都會保存到這裡|爬取網頁內容
我們引入requests包,使用上述示例內容解析網頁並將內容返回給content
變數
import requestsurl = http://www.360doc.com/content/07/0310/18/17841_392130.shtmlcontent = requests.get(url).text
可以將從content
保存到本地文件:
import oswith open(contentUrl.txt, w, encoding = utf-8-sig) as txtfile: txtfile.write(content)
2、正則表達式解析
re
的教程可以從這裡進去:Python 正則表達式。
re
是Python內置的正則表達式包,使用re
匹配字元串分兩步走:* 打包正則表達式字元串:使用re.compile
將一個字元串轉化為正則表達式對象。* 匹配:使用re.findall
匹配文本,用法:re.findall(pattern, string)
,findall接受兩個參數,一個是預期找到的字元串,一個是匹配的全文。這裡我們需要找到書名和對應的下載鏈接,先構造兩個正則化對象,代碼如下
import recontent = content.replace(
, ).replace( ,)#清除所有換行符和空格bookPatterns = re.compile(r(《.*?》.*?)<br>)urlPatterns = re.compile(r<ahref="(http://www.swdyj.com.*?.(exe|rar|zip|RAR|chm))")
bookPatterns是書名的正則化對象,urlPatterns是下載鏈接的正則化對象。
接下來我們需要對網頁文本進行匹配。
bookResult = re.findall(bookPatterns, contents)bookName = bookResult[1:]urls = [url[0] for url in re.findall(urlPatterns, contents)]
這裡的bookName取返回結果index為1開始的數組是因為匹配的文本第一項(index為0)並不是我們想要的結果。
urls是對匹配結果處理過後得到的正確url,不處理的匹配結果:[(http://www.swdyj.com/sj/GSQSJS.rar, rar), (http://www.swdyj.com/sj/LZT.rar, rar), (http://www.swdyj.com/sj/KXZF.rar, rar), (http://www.swdyj.com/sj/HDCZ.rar, rar), (http://www.swdyj.com/sj/ZQJYX.rar, rar), (http://www.swdyj.com/SJ/YDLL.rar, rar)]
3、保存到csv文件
這一步我們使用pandas將匹配結果保存到DataFrame對象
import pandas as pddf = pd.DataFrame(columns = [Book, url])df[Book] = bookNamedf[url] = urlsprint(df.head())with open(results.csv, w, encoding = utf-8-sig) as csvfile: df.to_csv(csvfile, index = False)
需要注意的是encoding = utf-8-sig
可以保證保存的文件打開後中文不亂碼。
保存結果:
4、下載文件
這個時候就可以暢快地使用BT下載了。
完整代碼:
import pandas as pdimport osimport reimport requestsurl = http://www.360doc.com/content/07/0310/18/17841_392130.shtmlcontent = requests.get(url).text# with open(content.txt, w, encoding = utf-8-sig) as txtfile:# txtfile.write(content)# with open(content.txt, r, encoding = utf-8-sig) as txtfile:# contents = txtfile.read().replace(
, ).replace( , )contents = content.replace(
, ).replace( , )bookPatterns = re.compile(r(《.*?》.*?)<br>)urlPatterns = re.compile(r<ahref="(http://www.swdyj.com.*?.(exe|rar|zip|RAR|chm))")bookResult = re.findall(bookPatterns, contents)bookName = bookResult[1:]print(re.findall(urlPatterns, contents))urls = [url[0] for url in re.findall(urlPatterns, contents)]df = pd.DataFrame(columns = [Book, url])df[Book] = bookNamedf[url] = urlswith open(results.csv, w, encoding = utf-8-sig) as csvfile: df.to_csv(csvfile, index = False)
參考鏈接:
Requests官方文檔:http://docs.python-requests.org/en/master/Python HTTP庫requests 介紹-簡書:https://www.jianshu.com/p/84ea562f0932推薦閱讀:
※編程小白如何寫爬蟲程序
※Python豆瓣登陸終於
※通過python進行單網頁內圖片爬取及下載
※xpath+mongodb抓取伯樂在線實戰
※利用python處理PDF文本