爬取百度文庫文章

前言

相信很多小夥伴在網上摘抄論文的時候都曾經受過百度文庫無法複製的苦吧,那麼我們是真的沒辦法把這些文字複製下來了嗎?
答案是否定的,博主的觀點是,竟然是出現在我們瀏覽器上面的內容了,當然就可以拿下來啦,下面以爬取全國大學生同上一堂思政課觀後感爲例。

網頁分析

我們對下面的網頁進行分析:
同上一堂思政課觀後感
首先查看網頁源代碼,我們發現並沒有論文上的文字內容,那麼說明這些文字並不在源html文件上,那麼很有可能是瀏覽器加載js文件渲染出來的,我們打開開發者模式,選擇network,同時只保留js
在這裏插入圖片描述
往下找,我們果然發現了包含有文字的js文件
在這裏插入圖片描述
打開該js文件的url,我們卻並沒有看到這些文字
在這裏插入圖片描述
這是怎麼回事呀?不要驚慌,這些文字其實是在這裏的,只不過我們不認識,這是由於編碼的問題,這也是下面我們寫程序時需要注意的一個點,下圖框起來的地方其實就是我們需要拿下的文字了。
在這裏插入圖片描述
網頁分析完成了,準備工作都做好了,下面我們開始寫程序吧!

軟件要求

  1. python3
  2. 第三方庫requests
  3. python內置的re模塊

requests介紹

requests是使用Apache2 licensed 許可證的HTTP庫,是用python編寫的,它比urllib2模塊更簡潔。
Request支持HTTP連接保持和連接池,支持使用cookie保持會話,支持文件上傳,支持自動響應內容的編碼,支持國際化的URL和POST數據自動編碼。
在python內置模塊的基礎上進行了高度的封裝,從而使得python進行網絡請求時,變得人性化,使用Requests可以輕而易舉的完成瀏覽器可有的任何操作。
requests會自動實現持久連接keep-alive。
感興趣的朋友可以去requests官方文檔瀏覽相應內容。

程序編寫

首先我們需要導入我們需要的模塊:
re模塊是python內置的,requests模塊需要安裝,考慮到一些朋友沒有安裝requests,下面簡單地介紹下安裝。
安裝過程非常簡單,只需要在shell下輸入:
注:-i參數是更換安裝源,這裏我們更換成豆瓣的源,安裝更快。
pip install requests -i "https://pypi.doubanio.com/simple/"
下面正式進入程序的編寫:
首先我們需要導入我們所需要的模塊:

# 導入requests和re模塊
import requests
import re

定義請求url和請求頭,這裏的url爲我們找到的js文件的url。

url = "https://wkbjcloudbos.bdimg.com/v1/docconvert9065/wk/a3c4685a32e9f1bb2f27fcd900944bcb/0.json?responseContentType=application%2Fjavascript&responseCacheControl=max-age%3D3888000&responseExpires=Sat%2C%2009%20May%202020%2020%3A32%3A45%20%2B0800&authorization=bce-auth-v1%2Ffa1126e91489401fa7cc85045ce7179e%2F2020-03-25T12%3A32%3A45Z%2F3600%2Fhost%2F751fc100a09cf16a189717caad7780f4ce8b3621ab69c2ec475565ecfa478dcc&x-bce-range=0-8759&token=eyJ0eXAiOiJKSVQiLCJ2ZXIiOiIxLjAiLCJhbGciOiJIUzI1NiIsImV4cCI6MTU4NTE0MzE2NSwidXJpIjp0cnVlLCJwYXJhbXMiOlsicmVzcG9uc2VDb250ZW50VHlwZSIsInJlc3BvbnNlQ2FjaGVDb250cm9sIiwicmVzcG9uc2VFeHBpcmVzIiwieC1iY2UtcmFuZ2UiXX0%3D.mpGXXDwegNNol42XDz1iaEv6YUxgKggkR6ycrt8con8%3D.1585143165"

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
                  "Chrome/76.0.3809.100 Safari/537.36"
}

對服務器進行請求:

content = requests.get(url=url,headers=headers)

這裏我們需要設置requests的編碼格式,上文也提到了js裏面的內容由於編碼的問題,我們拿到的並不是文字,那麼如何轉換成漢字呢?其實很簡單,我們可以直接設置requests的編碼方式

content.encoding = "unicode_escape"

然後使用正則表達式提取我們需要的內容

content_list = re.findall('"c":"(.*?)","p"',content.text)

然後就可以利用一個循環打印出這些文字啦

for sentence in content_list:
    print(sentence,end="")

運行程序,我們可以看到漢字已經被我們拿下來了
在這裏插入圖片描述
這裏看到我們其實只拿到了一部分內容,那是因爲一個js文件中的內容就這麼多,我們需要把瀏覽器收到的js文件全部拿下來才能得到完整內容。
在這裏插入圖片描述
完整程序如下:

#導入模塊requests,re
import requests
import re

#定義請求url
url = "https://wkbjcloudbos.bdimg.com/v1/docconvert9065/wk/a3c4685a32e9f1bb2f27fcd900944bcb/0.json?responseContentType=application%2Fjavascript&responseCacheControl=max-age%3D3888000&responseExpires=Sat%2C%2009%20May%202020%2020%3A32%3A45%20%2B0800&authorization=bce-auth-v1%2Ffa1126e91489401fa7cc85045ce7179e%2F2020-03-25T12%3A32%3A45Z%2F3600%2Fhost%2F751fc100a09cf16a189717caad7780f4ce8b3621ab69c2ec475565ecfa478dcc&x-bce-range=0-8759&token=eyJ0eXAiOiJKSVQiLCJ2ZXIiOiIxLjAiLCJhbGciOiJIUzI1NiIsImV4cCI6MTU4NTE0MzE2NSwidXJpIjp0cnVlLCJwYXJhbXMiOlsicmVzcG9uc2VDb250ZW50VHlwZSIsInJlc3BvbnNlQ2FjaGVDb250cm9sIiwicmVzcG9uc2VFeHBpcmVzIiwieC1iY2UtcmFuZ2UiXX0%3D.mpGXXDwegNNol42XDz1iaEv6YUxgKggkR6ycrt8con8%3D.1585143165"
#定義請求頭
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
                  "Chrome/76.0.3809.100 Safari/537.36"
}
#請求內容
content = requests.get(url=url,headers=headers)
#設置編碼方式
content.encoding = "unicode_escape"
#正則提取所需要的內容
content_list = re.findall('"c":"(.*?)","p"',content.text)
#循環打印
for sentence in content_list:
    print(sentence,end="")

以上就是博主今天和大家分享的內容了,希望能給大家帶來一定的收穫。
ps:現在是全國防疫特殊時期,希望大家健健康康的,注意自己的身體,祝大家學習進步,蒸蒸日上。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章