1.1-Python爬蟲案例演示urllib/requests
阿新 • • 發佈:2018-11-25
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)