本章主要講的是基於Python語言的數據採集,該功能要講起來可以單獨作為一門課程來學習,因為這是一門很重要的課程,一般運用在大數據處理和人工智慧上,該應用提供大量的數據。 1.urllib模塊的學習 urllib模塊是python提供給我們操作互聯網的模塊。接下來我們可以簡單的操作一下,爬取一個網頁 ...
本章主要講的是基於Python語言的數據採集,該功能要講起來可以單獨作為一門課程來學習,因為這是一門很重要的課程,一般運用在大數據處理和人工智慧上,該應用提供大量的數據。
1.urllib模塊的學習
urllib模塊是python提供給我們操作互聯網的模塊。接下來我們可以簡單的操作一下,爬取一個網頁的源代碼,其實就是審查元素的操作。urllib中分為四部分:1.request 2.error 3.parse 4.robotparser
request是urllib中最重要的也是最複雜的。
# 網路爬蟲 # 導入模塊 import urllib.request as req # 爬取該地址的網頁源碼 res=req.urlopen(r"https://www.baidu.com") # 從爬取的內容中讀取信息 html=res.read() # 讀取的信息是位元組,需要通過編碼格式的轉換,才能獲得和網頁上審查元素的源代碼一致 html=html.decode("UTF-8") print(html)
輸出結果:
2.實戰
2.1 爬取圖片
這裡我們來訪問一下百度圖片,其網站效果如圖:
那我們一般想要某張圖片,需要把滑鼠移動到圖片上點擊右鍵,然後圖片另存為……到我們電腦的指定的磁碟路徑下。接下來看看我們python怎麼通過代碼來爬取想要的圖片。我們先來看看這個圖片對應的訪問地址,右鍵複製圖片訪問地址,粘貼到地址上訪問一下,是否能正常訪問
即通過地址的訪問,可以查看某一張圖片,那麼我們來通過python爬蟲來爬取這張圖片。
# 導入模塊 import urllib.request as req #指定貓的訪問地址 res=req.urlopen("https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fimg.jj20.com%2Fup%2Fallimg%2F1113%2F052420110515%2F200524110515-2-1200.jpg&refer=http%3A%2F%2Fimg.jj20.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1662537204&t=69f97612ad5cfcc28f60537007447873") # 將貓圖片讀取,位元組保存 cat_img=res.read() # 指定一個本地路徑,用於存儲圖片,並允許寫入位元組 f=open("cat_200_287.jpg","wb") #將圖片存儲 f.write(cat_img)
執行完成後,可發現項目路徑下已經將該圖片爬取了。
12.2.2 線上文本翻譯
打開瀏覽器訪問有道翻譯的網站線上翻譯_有道
接著我們右鍵審查元素,切換到network,查看其網路的請求和響應信息
單擊這個響應請求,查看其翻譯信息
查看響應頭信息
瀏覽器一般通過以下信息來判斷是否是機器訪問,而非人為正常操作。
如果使用python訪問的該地址的話,User-Agent會被定義為Python-urllib/版本號
剛通過觀察瀏覽器的返回結果:{"errorCode":0,"translateResult":[[{"tgt":"I'm a teacher","src":"我是一名老師"}]],"type":"zh-CHS2en"}
那麼這個格式是json格式,由{}和[]混合使用構建成,中間形成鍵值對並以冒號隔開key和value。
# -*- coding:utf-8 -*- ''' 使用 POST 方式抓取 有道翻譯 urllib2.Request(requestURL, data=data, headers=headerData) Request 方法中的 data 參數不為空,則預設是 POST 請求方式 如果 data 為空則是 Get 請求方式 {"errorCode":50}錯誤: 有道翻譯做了一個反爬蟲機制,就是在參數中添加了 salt 和 sign 驗證,具體操作說明參考: http://www.tendcode.com/article/youdao-spider/ ''' import urllib.request import urllib.parse import time import random import hashlib import sys # 字元串轉 utf-8 需要重新設置系統的編碼格式 def reload(sys): sys.setdefaultencoding('utf8') # 目標語言 targetLanguage = 'Auto' # 源語言 sourceLanguage = 'Auto' headerData = { 'Cookie': '[email protected];', 'Referer': 'fanyi.youdao.com', 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36' } # 語言類型縮寫 languageTypeSacronym = { '1': 'zh-CHS 》 en', '2': 'zh-CHS 》 ru', '3': 'en 》 zh-CHS', '4': 'ru 》 zh-CHS', } # 翻譯類型 translateTypes = [ '中文 》 英語', '中文 》 俄語', '英語 》 中文', '俄語 》 中文' ] def startRequest(tanslateWd): requestURL = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule' client = 'fanyideskweb' timeStamp = getTime() key = 'ebSeFb%=XZ%T[KZ)c(sy!' sign = getSign(client, tanslateWd, timeStamp, key) data = { 'i': tanslateWd, 'from':sourceLanguage, 'to':targetLanguage, 'client':client, 'doctype':'json', 'version':'2.1', 'salt':timeStamp, 'sign':sign, 'keyfrom':'fanyi.web', 'action':'FY_BY_REALTIME', 'typoResult':'true', 'smartresult':'dict' } data = urllib.parse.urlencode(data).encode(encoding="utf-8") request = urllib.request.Request(requestURL, data=data, headers=headerData) resonse = urllib.request.urlopen(request) print(resonse.read().decode("utf-8")) # 生成時間戳 def getTime(): return str(int(time.time() * 1000) + random.randint(0, 10)) # 生成 Sign def getSign(client, tanslateWd, time, key): s = client + tanslateWd + time + key m = hashlib.md5() m.update(s.encode('utf-8')) return m.hexdigest() def getTranslateType(translateType): global sourceLanguage, targetLanguage try: if translateType: l = languageTypeSacronym[translateType].split(' 》 ') sourceLanguage = l[0] targetLanguage = l[1] except: print('翻譯類型選擇有誤,程式將使用 Auto 模式為您翻譯') if __name__ == '__main__': print('翻譯類型:') for i, data in enumerate(translateTypes): print('%d: %s' %(i + 1, data)) translateType = input('請選擇翻譯類型:') getTranslateType(translateType) tanslateWd = input('請輸入要翻譯的消息:') startRequest(tanslateWd)