爬蟲MOOC 第一週 入門

Python網絡爬蟲與信息提取

講師:嵩天


第一步 安裝測試Request庫


# -*- coding:utf-8 -*-
import requests
r = requests.get("http://www.baidu.com")
# requests 是 Response對象,包含了爬蟲返回的內容
# get 是 Request對象
print r.status_code # 200 表示鏈接上了,404 表示失敗
r.encoding = 'utf-8'
print r.textPython





===========================================================================





======================================================================================

上 http://www.jd.com/robots.txt

可以看見 robots 協議。

robots 協議一定在網站根目錄。


User-agent: * #任何來源的爬蟲
Disallow: /?* #任何爬蟲都不能訪問 ?* 數據
Disallow: /pop/*.html #任何爬蟲都不能訪問 /pop/*.html,  其中 / 表示根目錄
Disallow: /pinpai/*.html?* 
User-agent: EtaoSpider  # 這四種爬蟲都不能爬京東的任何資源
Disallow: / 
User-agent: HuihuiSpider 
Disallow: / 
User-agent: GwdangSpider 
Disallow: / 
User-agent: WochachaSpider 
Disallow: /


那麼爬蟲要遵守這個協議,除非訪問量非常小。


============================================================

實例1:京東爬蟲

http://item.jd.com/2967929.html

以這個網頁爲例子:


# -*- coding:utf-8 -*-
import requests
url = "http://item.jd.com/2967929.html"
try:
    r = requests.get(url)
    r.raise_for_status() # 如果失敗則返回錯誤,直接跳到 except
    r.encoding = r.apparent_encoding 
    # 編碼方式爲自動選擇爲apparent_encoding
    # r.encoding = 'GBK' # 這個網頁編碼是GBK
    print r.text[:1000] # 前1000個字符
except:
    print("爬取失敗")

============================================================

實例2:亞馬遜爬蟲

https://www.amazon.cn/gp/product/B01M8L5Z3Y



亞馬遜會拒絕實例1的爬蟲,返回錯誤503,因此要更改一下頭部信息。


# -*- coding:utf-8 -*-
import requests
kv = {'user-agent':'Mozilla/5.0'} #重新定義 user-agent 內容,模擬瀏覽器
url = "https://www.amazon.cn/gp/product/B01M8L5Z3Y"
try:
    r = requests.get(url, headers = kv)
    r.raise_for_status() # 如果失敗則返回錯誤,直接跳到 except
    # 亞馬遜這裏是錯誤 503
    r.encoding = r.apparent_encoding 
    # 編碼方式爲自動選擇爲apparent_encoding
    # r.encoding = '...' # 這個網頁編碼是...
    print r.text[:1000] # 前1000個字符
except:
    print("爬取失敗")


============================================================================

實例3:百度/360搜索關鍵詞提交


Baidu關鍵詞接口:

http://www.baidu.com/s?wd=keyword


360關鍵詞接口:

http://www.so.com/s?q=keyword

# -*- coding:utf-8 -*-
import requests
kv = {'wd':'Python'} # 關鍵詞 Python
try:
    r = requests.get("http://www.baidu.com/wd", params = kv) # 通過 params 注入關鍵詞
    r.raise_for_status() # 如果失敗則返回錯誤,直接跳到 except
    print r.request.url # 打印 url 發現加入了關鍵詞
    print len(r.text) # 打印返回信息的大小
except:
    print("爬取失敗")

360同理,我們小小變化一下:

# -*- coding:utf-8 -*-
import requests
keyword = 'Python' # 關鍵詞 Python
try:
    kv = {'q':keyword}
    r = requests.get("http://www.so.com/s", params = kv) # 通過 params 注入關鍵詞
    r.raise_for_status() # 如果失敗則返回錯誤,直接跳到 except
    print r.request.url # 打印 url 發現加入了關鍵詞
    print len(r.text) # 打印返回信息的大小
except:
    print("爬取失敗")

返回的信息都很長,這裏就別打印了,看看長度就行了。

===========================================================================

實例4:網絡圖片的爬取和存儲

網絡圖片鏈接格式:

http://www.example.com/picture.jpg


實際鏈接:

http://image.nationalgeographic.com.cn/2017/0211/20170211061910157.jpg



# -*- coding:utf-8 -*-
import requests
import os
root = "C:\Users\Administrator\Desktop\Python\MOOC\ " # 保存在這裏
url = 'http://image.nationalgeographic.com.cn/2017/0211/20170211061910157.jpg'
path = root + url.split('/')[-1] #path 爲 root 加上 url中 / 分割的倒數第一部分
try:
    if not os.path.exists(root): # 如果路徑不存在
        os.mkdit(root) #新建文件夾
    if not os.path.exists(path): # 如果文件不存在
        r = requests.get(url) 
        with open(path, 'wb') as f: # 打開了一個文件,定義爲文件標識符 f
            f.write(r.content) # 返回的內容 r.content 寫入文件中,r.content 是文件的二進制形式
            f.close() # 關閉文件
            print "Picture have been saved successfully."
    else:
        print "Picture already existed."
except:
    print "Fail."


現在打開文件夾看看,發現已經存在啦~
==================================================================================

實例5: IP 地址歸屬地的自動查詢


www.ip138.com


這個網站的 IP 地址輸入接口爲:

http://m.ip138.com/ip.asp?ip=ipaddress

import requests
url = 'http://m.ip138.com/ip.asp?ip='
try:
    r = requests.get(url + '202.204.80.112')
    r.raise_for_status()
    r.encoding = r.apparent_encoding
    print r.text[-500:] # 倒數500字節 
except:
    print "Fail."

這個例子的意義在於說明人機交互提交信息都是以url鏈接的形式提交的。


=======================================================================




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