怎麼利用Python網路爬蟲來提取資訊

專注的阿熊發表於2020-03-20

下面小編就為大家帶來一篇Python網路爬蟲與資訊提取(例項講解)。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
課程體系結構:


1、Requests框架:自動爬取HTML頁面與自動網路請求提交


2、robots.txt:網路爬蟲排除標準


3、BeautifulSoup框架:解析HTML頁面


4、Re框架:正則框架,提取頁面關鍵資訊


5、Scrapy框架:網路爬蟲原理介紹,專業爬蟲框架介紹


理念:The Website is the API …


Python語言常用的IDE工具


文字工具類IDE:


IDLE、Notepad++、Sublime Text、Vim & Emacs、Atom、Komodo Edit


整合工具IDE:


PyCharm、Wing、PyDev & Eclipse、Visual Studio、Anaconda & Spyder、Canopy


·IDLE是Python自帶的預設的常用的入門級編寫工具,它包含互動式檔案式兩種方式。適用於較短的程式。


·Sublime Text是專為程式設計師開發的第三方專用程式設計工具,可以提高程式設計體驗,具有多種程式設計風格。


·Wing是Wingware公司提供的收費IDE,除錯功能豐富,具有版本控制,版本同步功能,適合於多人共同開發。適用於編寫大型程式。


·Visual Studio是微軟公司維護的,可以透過配置PTVS編寫Python,主要以Windows環境為主,除錯功能豐富。


·Eclipse是一款開源的IDE開發工具,可以透過配置PyDev來編寫Python,但是配置過程複雜,需要有一定的開發經驗。


·PyCharm分為社群版和專業版,社群版免費,具有簡單、整合度高的特點,適用於編寫較複雜的工程。


適用於科學計算、資料分析的IDE:


·Canopy是由Enthought公司維護的收費工具,支援近500個第三方庫,適合科學計算領域應用開發。


·Anaconda是開源免費的,支援近800個第三方庫。


Requests庫入門


Requests的安裝:


Requests庫是目前公認的爬取網頁最好的Python第三方庫,具有簡單、簡捷的特點。


官方網站:


在"C:\Windows\System32"中找到"cmd.exe",使用管理員身份執行,在命令列中輸入:“pip install requests”執行。
使用IDLE測試Requests庫:


>>> import requests
>>> r = requests.get(")#抓取百度頁面
>>> r.status_code
>>> r.encoding = 'utf-8'
>>> r.text
1
2
3
4
5
Requests庫的7個主要方法
get()方法


r = requests.get(url)


get()方法構造一個向伺服器請求資源的Request物件,返回一個包含伺服器資源的Response物件。


requests.get(url, params=None, **kwargs)


url:擬獲取頁面的url連結


params:url中的額外引數,字典或位元組流格式,可選


**kwargs:12個控制訪問引數


Requests庫的2個重要物件


· Request


· Response:Response物件包含爬蟲返回的內容


Response物件的屬性


r.status_code :HTTP請求的返回狀態,200表示連線成功,404表示失敗


r.text :HTTP響應內容的字串形式,即,url對應的頁面內容


r.encoding : 從HTTP header中猜測的相應內容編碼方式


r.apparent_encoding : 從內容中分析出的相應內容編碼方式(備選編碼方式)


r.content : HTTP響應內容的二進位制形式


r.encoding :如果header中不存在charset,則認為編碼為ISO-8859-1 。


r.apparent_encoding :根據網頁內容分析出的編碼方式可以 看作是r.encoding的備選。


Response的編碼:


r.encoding :  從HTTP header中猜測的響應內容的編碼方式;如果header中不存在charset,則認為編碼為ISO-8859-1,r.text根據r.encoding顯示網頁內容


r.apparent_encoding : 根據網頁內容分析出的編碼方式,可以看作r.encoding的備選


爬取網頁的通用程式碼框架


Requests庫的異常
Response的異常


r.raise_for_status() : 如果不是200,產生異常requests.HTTPError;


在方法內部判斷r.status_code是否等於200,不需要增加額外的if語句,該語句便於利用try-except進行異常處理


import requests
 
def getHTMLText(url):
  try:
    r = requests.get(url, timeout=30)
    r.raise_for_status() # 如果狀態不是200,引發HTTPError異常
    r.encoding = r.apparent_encoding
    return r.text
  except: 
    return "產生異常"
 
if __name__ == "__main__":
  url = "
  print(getHTMLText(url))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
通用程式碼框架,可以使使用者爬取網頁變得更有效,更穩定、可靠。


HTTP協議


HTTP,Hypertext Transfer Protocol,超文字傳輸協議。


HTTP是一個基於“請求與響應”模式的、無狀態的應用層協議。


HTTP協議採用URL作為定位網路資源的標識。


URL格式:[:port][path]


· host:合法的Internet主機域名或IP地址
· port:埠號,預設埠號為80
· path:請求資源的路徑


HTTP URL的理解:


URL是透過HTTP協議存取資源的Internet路徑,一個URL對應一個資料資源。


HTTP協議對資源的操作
理解PATCH和PUT的區別


假設URL位置有一組資料UserInfo,包括UserID、UserName等20個欄位。


需求:使用者修改了UserName,其他不變。


· 採用PATCH,僅向URL提交UserName的區域性更新請求。


· 採用PUT,必須將所有20個欄位一併提交到URL,未提交欄位被刪除。


PATCH的主要好處:節省網路頻寬


Requests庫主要方法解析


requests.request(method, url, **kwargs)


· method:請求方式,對應get/put/post等7種


例: r = requests.request(‘OPTIONS’, url, **kwargs)


· url:擬獲取頁面的url連結


· **kwargs:控制訪問的引數,共13個,均為可選項


params:字典或位元組序列,作為引數增加到url中;


kv = {'key1':'value1', 'key2':'value2'}
r = requests.request('GET', ')
print(r.url)
'''

'''
1
2
3
4
5
6
data:字典、位元組序列或檔案物件,作為Request的內容;


json:JSON格式的資料,作為Request的內容;


headers:字典,HTTP定製頭;


hd = {'user-agent':'Chrome/10'}
 
r = requests.request('POST',')
1
2
3
cookies:字典或CookieJar,Request中的cookie;


auth:元組,支援HTTP認證功能;


files:字典型別,傳輸檔案;


fs = {'file':open('data.xls', 'rb')}
 
r = requests.request('POST',')
1
2
3
timeout:設定超時時間,秒為單位;


proxies:字典型別,設定訪問代理伺服器,可以增加登入認證


allow_redirects:True/False,預設為True,重定向開關;


stream:True/False,預設為True,獲取內容立即下載開關;


verify:True/False,預設為True,認證SSL證照開關;


cert:本地SSL證照路徑


#方法及引數
requests.get(url, params=None, **kwargs)
requests.head(url, **kwargs)
requests.post(url, data=None, json=None, **kwargs)
requests.put(url, data=None, **kwargs)
requests.patch(url, data=None, **kwargs)
requests.delete(url, **kwargs)
1
2
3
4
5
6
7


網路爬蟲引發的問題


效能騷擾:


受限於編寫水平和目的,網路爬蟲將會為web伺服器帶來巨大的資源開銷


法律風險:


伺服器上的資料有產權歸屬,網路爬蟲獲取資料後牟利將帶來法律風險。


隱私洩露:


網路爬蟲可能具備突破簡單訪問控制的能力,獲得被保護資料從而洩露個人隱私。


網路爬蟲的限制


·來源審查:加密貨幣http://www.gendan5.com/digitalcurrency/btc.html 判斷User-Agent進行限制



檢查來訪HTTP協議頭的User-Agent域,值響應瀏覽器或友好爬蟲的訪問。


· 釋出公告:Roots協議


告知所有爬蟲網站的爬取策咯,要求爬蟲遵守。


Robots協議


Robots Exclusion Standard 網路爬蟲排除標準


作用:網站告知網路爬蟲哪些頁面可以抓取,哪些不行。


形式:在網站根目錄下的robots.txt檔案。


案例:京東的Robots協議





# 註釋:*代表所有,/代表根目錄
User-agent: * 
Disallow: /?* 
Disallow: /pop/*.html 
Disallow: /pinpai/*.html?* 
User-agent: EtaoSpider 
Disallow: / 
User-agent: HuihuiSpider 
Disallow: / 
User-agent: GwdangSpider 
Disallow: / 
User-agent: WochachaSpider 
Disallow: /
1
2
3
4
5
6
7
8
9
10
11
12
13
Robots協議的使用


網路爬蟲:自動或人工識別robots.txt,再進行內容爬取。
  約束性:Robots協議是建議但非約束性,網路爬蟲可以不遵守,但存在法律風險。


Requests庫網路爬蟲實戰


1、京東商品


import requests
url = "
try:
 r = requests.get(url)
 r.raise_for_status()
 r.encoding = r.apparent_encoding
 print(r.text[:1000])
except:
 print("爬取失敗")
1
2
3
4
5
6
7
8
9
2、亞馬遜商品


# 直接爬取亞馬遜商品是會被拒絕訪問,所以需要新增'user-agent'欄位
import requests
url = "
try:
 kv = {'user-agent':'Mozilla/5.0'} # 使用代理訪問
 r = requests.get(url, headers = kv)
 r.raise_for_status()
 r.encoding = r.apparent_encoding
 print(t.text[1000:2000])
except:
 print("爬取失敗"
1
2
3
4
5
6
7
8
9
10
11
3、百度/360搜尋關鍵詞提交


搜尋引擎關鍵詞提交介面


· 百度的關鍵詞介面:





· 360的關鍵詞介面:





# 百度
import requests
keyword = "Python"
try:
 kv = {'wd':keyword}
 r = requests.get(")
 print(r.request.url)
 r.raise_for_status()
 print(len(r.text))
except:
 print("爬取失敗")
1
2
3
4
5
6
7
8
9
10
11
# 360
import requests
keyword = "Python"
try:
 kv = {'q':keyword}
 r = requests.get(")
 print(r.request.url)
 r.raise_for_status()
 print(len(r.text))
except:
 print("爬取失敗")
1
2
3
4
5
6
7
8
9
10
11
4、網路圖片的爬取和儲存


網路圖片連結的格式:





國家地理:





選擇一張圖片連結:


http://image.nationalgeographic.com.cn/2017/0704/20170704030835566.jpg


圖片爬取全程式碼
import requests
import os
url = "http://image.nationalgeographic.com.cn/2017/0704/20170704030835566.jpg"
root = "D://pics//"
path = root + url.split('/')[-1]
try:
 if not os.path.exists(root):
  os.mkdir(root)
 if not os.path.exists(path):
  r = requests.get(url)
  with open(path,'wb') as f:
   f.write(r.content)
   f.close()
   print("檔案儲存成功")
 else:
  print("檔案已存在")
except:
 print("爬取失敗")
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
5、IP地址歸屬地的自動查詢


IP查詢








import requests
url = "
ip = "220.204.80.112"
try:
 r = requests.get(url + ip)
 r.raise_for_status()
 r.encoding = r.apparent_encoding
 print(r.text[1900:])
except:
 print("爬取失敗")
1
2
3
4
5
6
7
8
9
10
# 使用IDLE
>>> import requests
>>> url ="
>>> ip = "220.204.80.112"
>>> r = requests.get(url + ip)
>>> r.status_code
>>> r.text

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69946337/viewspace-2681670/,如需轉載,請註明出處,否則將追究法律責任。

相關文章