爬蟲-使用Python3爬取360DOC文檔

tags:

Python3、爬蟲、網頁、requests、re、正則表達式

問題描述

瀏覽網頁的時候遇到這篇筆記:

360doc.com/content/07/0

想要把頁面上的書籍全下載下來,一共有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官方文檔:docs.python-requests.org

Python HTTP庫requests 介紹-簡書:jianshu.com/p/84ea562f0


推薦閱讀:

編程小白如何寫爬蟲程序
Python豆瓣登陸終於
通過python進行單網頁內圖片爬取及下載
xpath+mongodb抓取伯樂在線實戰
利用python處理PDF文本

TAG:Python | 網頁爬蟲 | python爬蟲 |