1. 程式人生 > >1.1-Python爬蟲案例演示urllib/requests

1.1-Python爬蟲案例演示urllib/requests

Python爬蟲urllib/requests

1.urllib模組

一個簡單的Python爬蟲框架-案例v1

from urllib import request
'''
使用urllib.request請求一個網頁內容,並把內容打印出來
'''


if __name__ == '__main__':

    url = "http://jobs.zhaopin.com/195435110251173.htm?ssidkey=y&ss=409&ff=03&sg=2644e782b8b143419956320b22910c91&so=1"
    # 開啟相應url並把相應頁面作為返回
    rsp = request.urlopen(url)

    # 把返回結果讀取出來
    # 讀取出來內容型別為bytes
    html = rsp.read()
    print(type(html))

    # 如果想把bytes內容轉換成字串,需要解碼
    html = html.decode("utf-8")

    print(html)

chardet 網頁編碼問題-案例v2

'''
利用request下載頁面
自動檢測頁面編碼

'''

import urllib
import chardet

if __name__ == '__main__':
    url = 'http://stock.eastmoney.com/news/1407,20170807763593890.html'

    rsp = urllib.request.urlopen(url)

    html = rsp.read()

    #利用 chardet自動檢測
    cs = chardet.detect(html)
    print(type(cs))
    print(cs)


    # 使用get取值保證不會出錯
    html = html.decode(cs.get("encoding", "utf-8"))
    print(html)

urlopen返回物件-案例v3

import urllib

if __name__ == '__main__':
    url = 'http://stock.eastmoney.com/news/1407,20170807763593890.html'

    rsp = urllib.request.urlopen(url)

    print(type(rsp))
    print(rsp)


    print("URL: {0}".format( rsp.geturl()))
    print("Info: {0}".format(rsp.info()))
    print("Code: {0}".format(rsp.getcode()))

    html = rsp.read()


    # 使用get取值保證不會出錯
    html = html.decode()

request.data的使用get-案例v4

from urllib import request, parse

'''
掌握對url進行引數編碼的方法
需要使用parse模組
'''

if __name__ == '__main__':

    url = 'http://www.baidu.com/s?'
    wd = input("Input your keyword:")


    # 要想使用data, 需要使用字典結構
    qs = {
        "wd": wd
    }

    # 轉換url編碼
    qs = parse.urlencode(qs)
    print(qs)

    fullurl = url + qs
    print(fullurl)

    # 如果直接用可讀的帶引數的url,是不能訪問的
    #fullurl = 'http://www.baidu.com/s?wd=大熊貓'

    rsp = request.urlopen(fullurl)

    html = rsp.read()


    # 使用get取值保證不會出錯
    html = html.decode()

    print(html)

request.post的使用-案例v5

'''
利用parse模組模擬post請求
分析百度詞典
分析步驟:
1. 開啟F12
2. 嘗試輸入單詞girl,發現每敲一個字母后都有請求
3. 請求地址是 http://fanyi.baidu.com/sug
4. 利用NetWork-All-Hearders,檢視,發現FormData的值是 kw:girl
5. 檢查返回內容格式,發現返回的是json格式內容==>需要用到json包
'''

from urllib import request, parse
# 負責處理json格式的模組
import json

'''
大致流程是:
1. 利用data構造內容,然後urlopen開啟
2. 返回一個json格式的結果
3. 結果就應該是girl的釋義
'''

baseurl = 'http://fanyi.baidu.com/sug'


# 存放用來模擬form的資料一定是dict格式
data = {
    # girl是翻譯輸入的英文內容,應該是由使用者輸入,此處使用硬編碼
    'kw': 'girl'
}

# 需要使用parse模組對data進行編碼
data = parse.urlencode(data).encode("utf-8")

print(type(data))
#  我們需要構造一個請求頭,請求頭部應該至少包含傳入的資料的長度
# request要求傳入的請求頭是一個dict格式

headers = {
    # 因為使用post,至少應該包含content-length 欄位
    'Content-Length':len(data)
}


# 有了headers,data,url,就可以嘗試發出請求了
rsp = request.urlopen(baseurl, data=data)

json_data = rsp.read().decode('utf-8')
print( type(json_data))
print(json_data)


# 把json字串轉化成字典
json_data = json.loads(json_data)
print(type(json_data))
print(json_data)


for item in json_data['data']:
    print(item['k'], "--", item['v'])

request.data的使用:request.request類

'''
任務要求和內容跟V5 一樣
本案例只是利用Request來實現v5的內容

利用parse模組模擬post請求
分析百度詞典
分析步驟:
1. 開啟F12
2. 嘗試輸入單詞girl,發現每敲一個字母后都有請求
3. 請求地址是 http://fanyi.baidu.com/sug
4. 利用NetWork-All-Hearders,檢視,發現FormData的值是 kw:girl
5. 檢查返回內容格式,發現返回的是json格式內容==>需要用到json包
'''

from urllib import request, parse
# 負責處理json格式的模組
import json

'''
大致流程是:
1. 利用data構造內容,然後urlopen開啟
2. 返回一個json格式的結果
3. 結果就應該是girl的釋義
'''

baseurl = 'http://fanyi.baidu.com/sug'


# 存放用來模擬form的資料一定是dict格式
data = {
    # girl是翻譯輸入的英文內容,應該是由使用者輸入,此處使用硬編碼
    'kw': 'girl'
}

# 需要使用parse模組對data進行編碼
data = parse.urlencode(data).encode("utf-8")

#  我們需要構造一個請求頭,請求頭部應該至少包含傳入的資料的長度
# request要求傳入的請求頭是一個dict格式

headers = {
    # 因為使用post,至少應該包含content-length 欄位
    'Content-Length':len(data)
}

# 構造一個Request的例項
req = request.Request(url=baseurl, data=data, headers=headers)

# 因為已經構造了一個Request的請求例項,則所有的請求資訊都可以封裝在Request例項中
rsp = request.urlopen(req)

json_data = rsp.read().decode('utf-8')
print( type(json_data))
print(json_data)


# 把json字串轉化成字典
json_data = json.loads(json_data)
print(type(json_data))
print(json_data)


for item in json_data['data']:
    print(item['k'], "--", item['v'])

urllib.error:URLError產生的原因-案例v7

'''\
URLError的使用
'''

from urllib import request, error


if __name__ == '__main__':

    url = "http://www.baiiiiiiiiiidu.com"

    try:

        req = request.Request(url)
        rsp = request.urlopen( req )
        html = rsp.read().decode()
        print(html)

    except error.URLError as e:
        print("URLError: {0}".format(e.reason))
        print("URLError: {0}".format(e))

    except Exception as e:
        print(e)

urllib.error:HTTPError-案例v8

'''\
URLError的使用
'''

from urllib import request, error


if __name__ == '__main__':

    url = "http:iiiiiiiiidu//www.baidu.com/welcome.html"

    url = "http://www.sipo.gov.cn/www"
    try:

        req = request.Request(url)
        rsp = request.urlopen( req )
        html = rsp.read().decode()
        print(html)

    except error.HTTPError as e:
        print("HTTPError: {0}".format(e.reason))
        print("HTTPError: {0}".format(e))

    except error.URLError as e:
        print("URLError: {0}".format(e.reason))
        print("URLError: {0}".format(e))

    except Exception as e:
        print(e)

UserAgent:使用者代理-案例v9


'''
訪問一個網址
更改自己的UserAgent進行偽裝
'''
from urllib import request, error


if __name__ == '__main__':

    url = "http://www.baidu.com"

    try:

        # 使用head方法偽裝UA
        # headers = {}
        # headers['User-Agent'] = 'Mozilla/5.0 (iPad; CPU OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3'
        # req = request.Request( url, headers=headers)

        # 使用add_header方法
        req = request.Request(url)
        req.add_header("User-Agent", "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36")

        # 正常訪問
        rsp = request.urlopen( req )
        html = rsp.read().decode()
        print(html)

    except error.HTTPError as e:
        print(e)
    except error.URLError as e:
        print(e)
    except Exception as e:
        print(e)

    print("DONE>.............")

ProxyHandler代理伺服器處理-案例v10

'''
使用代理訪問百度網站


'''


from urllib import  request, error


if __name__ == '__main__':

    url = "http://www.baidu.com"

    # 使用代理步驟
    # 1. 設定代理地址
    proxy = {'http': '120.194.18.90:81' }
    # 2. 建立ProxyHandler
    proxy_handler = request.ProxyHandler(proxy)
    # 3. 建立Opener
    opener = request.build_opener(proxy_handler)
    # 4. 安裝Opener
    request.install_opener( opener)

    # 現在如果訪問url,則使用代理伺服器
    try:
        rsp = request.urlopen(url)
        html = rsp.read().decode()
        print(html)
    except error.URLError as e:
        print(e)
    except Exception as e:
        print(e)