Spider_basic

網絡爬蟲

  • 定義:網絡蜘蛛、網絡機器人,抓取網絡數據的程序
  • 總結:用Python程序去模仿人去訪問網站,模仿的越逼真越好
  • 目的:經過有效的大量數據分析市場走勢、公司決策

企業獲取數據的方式

  1. 公司自有數據
  2. 第三方數據平臺購買
    • 數據堂、貴陽大數據交易所
  3. 爬蟲爬取數據
    • 市場上沒有或者價格過高,利用爬蟲程序爬取

Python作爬蟲優點

  • 請求模塊、解析模塊豐富成熟,強大的scrapy框架
    • PHP:對多線程、異步支持不太好
    • JAVA:代碼笨重,代碼量很大
    • C/C++:雖然效率高,可是代碼成型很慢

爬蟲分類

  1. 通用網絡爬蟲(搜索引擎引用,須要遵照robots協議)
    • http://www.taobao.com/robots.txt
    • 搜索引擎如何獲取一個新網站的URL
      • 網站主動向搜索引擎提供(百度站長平臺)
      • 和DNS服務網(萬網),快速收錄新網站
  2. 聚焦網絡爬蟲
    • 本身寫的爬蟲程序:
      • 面向主題的爬蟲
      • 面向需求的爬蟲

爬取數據步驟

  1. 肯定須要爬取的URL地址
  2. 經過HTTP/HTTPS協議來獲取相應的HTML頁面
  3. 提取HTML頁面有用的數據
    • 所需數據,保存
    • 頁面中有其餘的URL,繼續第2步

工具

Anaconda和Spyder

  1. Anaconda:開源的Python發行版本
  2. Spyder:集成開發環境
    • Spyder經常使用快捷鍵:
    • 註釋/取消註釋:ctrl + 1
    • 保存:ctrl + s
    • 運行程序:f5
    • 自動補全:Tab

Chrome瀏覽器插件

  • 安裝步驟
    1. 右上角 - 更多工具 - 擴展程序
    2. 點開右上角 - 開發者模式
    3. 把插件拖拽到瀏覽器頁面,釋放鼠標,點擊添加擴展...
  • 插件介紹
    1. Proxy SwitchOmega:代理切換插件
    2. Xpath Helper:網頁數據解析插件
    3. JSON View:查看json格式的數據(好看)

Fiddler抓包工具

  1. mac安裝
    • 安裝mono
    • 執行 /Library/Frameworks/Mono.framework/Versions/<Mono Version>/bin/mozroots --import --sync
    • 執行 export PATH="/Library/Frameworks/Mono.framework/Versions/5.20.1/bin:$PATH"
  2. 抓包工具設置
    • Tools -> options -> HTTPS -> ...from browers only
    • connections:設置端口號 8888
  3. 設置瀏覽器代理
    • Proxy SwitchOmega -> 選項 -> 新建情景模式 -> HTTP 127.0.0.1 8888 -> 應用選項
  4. 瀏覽器右上角圖標 -> proxy(self) -> 訪問百度

知識點

WEB

  • HTTP和HTTS
    • HTTP:80
    • HTTPS:443,HTTP的升級版,加了一個安全套接層
  • GET和POST
    • GET:查詢參數都會在URL上顯示出來
    • POST:查詢參數和須要提交數據是隱藏在Form表單裏的,不會再URL地址上顯示
  • URL:統一資源定位符
    • https:// item.jd.com :80 /26809408972.html #detail
    • 協議 域名/IP地址 端口 訪問資源的路徑 錨點
  • User-Agent
    • 記錄用戶的瀏覽器、操做系統等,爲了讓用戶獲取更好的HTML頁面效果
      • User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36
      • Mozilla Firefox:(Gecko內核)
      • IE:Trident(本身的內核)
      • Linux:KTHML(like Gecko)
      • Apple:Webkit(like KHTML)
      • Google:Chrome(like Webkit)
      • 其餘瀏覽器都是模仿IE/Chrome

爬蟲請求模塊

  • 版本
    • python2:urllib二、urllib
    • python3:把urllib和urllib2合併,urllib.request
  • 經常使用方法
    • urllib.request.urlopen("網址")
      • 做用:向網站發起一個請求並獲取響應
      • 字節流 = response.read()
      • 字符串 = response.read().decode("utf-8")
        • encode() : 字符串 --> bytes
        • decode() : bytes --> 字符串
    • 重構User-Agent
      • 不支持重構User-Agent:urlopen()
      • 支持重構User-Agent
        • urllib.request.Request(添加User-Agent)
        • urllib.request.Request("網址",headers="字典")
        • User-Agent是爬蟲和反爬蟲鬥爭的第一步,發送請求必須帶User-Agent

使用流程(見 02_urllib.request.Request.py)

  1. 利用Request()方法構建請求對象
  2. 利用urlopen()方法獲取響應對象
    • 利用響應對象的read().decode("utf-8")獲取內容
    • 響應對象response的方法
      1. read():讀取服務器響應的內容
      2. getcode():返回HTTP的響應碼
        print(respones.getcode())
        200 :成功
        4XX :服務器頁面出錯
        5XX :服務器出錯
      3. geturl():返回實際數據的URL(防止重定向問題)
import urllib.request

# 1. 建立請求對象(有User-Agent)
url = "http://www.baidu.com/"
headers = {"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36"}

req = urllib.request.Request(url, headers=headers)

# 2. 獲取響應對象
res = urllib.request.urlopen(req)

# 3. 讀取響應對象
html = res.read().decode("utf-8")

# 4. 具體操做
# print(html)
print(res.getcode())
print(res.geturl())
200
https://www.baidu.com/
  • urllib.parse模塊
    • urlencode(字典) ## 給中文編碼,三個百分號一個漢子,注意:參數必定要爲字典。
    • 實例見urlrequest.py
import urllib.parse
meinv = {"wd":"美女"}
meinv = urllib.parse.urlencode(meinv)
print(meinv)
wd=%E7%BE%8E%E5%A5%B3
import urllib.request
import urllib.parse


# 拼接URL
baseurl = "http://www.baidu.com/s?"
key = input("請輸入要搜索的內容:")
# 進行urlencode()編碼
key = urllib.parse.urlencode({"wd":key})
url = baseurl + key

headers = {"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36"}

# 建立請求對象
req = urllib.request.Request(url, headers=headers)

# 獲取響應對象
res = urllib.request.urlopen(req)
html = res.read().decode("utf-8")

# 寫入文件
with open("搜索.html", "w", encoding='utf-8') as f:
    f.write(html)
  • quote(字符串編碼)
  • unquote(字符串解碼)
key = urllib.parse.quote("字符串")
  baseurl = "http://www.baidu.com/s?wd="
  key = input("請輸入要搜索的內容:")
  #進行quote()編碼
  key = urllib.parse.quote(key)
  url = baseurl + key
  print(url)

練習

請求方式及實例

  • GEThtml

    1. 特色 :查詢參數在URL地址中顯示
    2. 案例 :抓取百度貼吧
  • POST(在Request方法中添加data參數)python

    1. urllib.request.Request(url,data=data,headers=headers)
      • data:表單數據以bytes類型提交,不能是str
    2. 處理表單數據爲bytes類型
      1. 把Form表單數據定義爲字典data
      2. urlencode(data)
      3. 轉爲bytes數據類型:bytes()
    3. 有道翻譯案例
    4. 有道翻譯返回的是json格式的字符串,如何把json格式的字符串轉換爲Python中字典
      import json
      r_dict = json.loads(r_json)
import urllib.request
import urllib.parse
import json


# 請輸入你要翻譯的內容
key = input("請輸入要翻譯的內容:")
# 把提交的form表單數據轉換爲bytes數據類型
data = {'i':key,
        'from':'AUTO',
        'to':'AUTO',
        'smartresult':'dict',
        'client':'fanyideskweb',
        'salt':'15567713651723',
        'sign':'3eee1e0b9cbebd65a65007f497a9b33a',
        'ts':'1556771365172',
        'bv':'d1dc01b5ffc1e7dfd53e6ee3c347fc81',
        'doctype':'json',
        'version':'2.1',
        'keyfrom':'fanyi.web',
        'action':'FY_BY_REALTlME'
        }
# 字符串i=key&from=AUTO&to=AUTO&s....
data = urllib.parse.urlencode(data)
data = bytes(data, "utf-8")
# 發請求,獲取相應
# url爲POST地址,抓包工具抓到的
url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule"
headers = {"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36"}
# 此處data爲form表單數據,爲bytes數據類型
req = urllib.request.Request(url, data=data, headers=headers)
res = urllib.request.urlopen(req)
r_json = res.read().decode("utf-8")

r_dict = json.loads(r_json)
print(r_dict["translateResult"][0][0]["tgt"])
請輸入要翻譯的內容:天堂
heaven
本站公眾號
   歡迎關注本站公眾號,獲取更多信息