請求方式:get 和 post
獲取AJAX加載的內(nèi)容 --用post,把數(shù)據(jù)存儲在request請求里的data=
有些網(wǎng)頁內(nèi)容使用AJAX請求加載橄碾,這種數(shù)據(jù)無法直接對網(wǎng)頁url進(jìn)行獲取。但是只要記住酵紫,AJAX請求一般返回給網(wǎng)頁的是JSON文件手负,只要對AJAX請求地址進(jìn)行POST或GET,就能返回JSON數(shù)據(jù)了。
? ? ? ? ? ? ? ? ? ? ? ? 爬取豆瓣熱門電影
import urllib.request
import urllib.parse
start=0
b=1
while True:
? ? url_base='http://movie.douban.com/j/chart/top_list?'
? ? url_kw={
? ? ? ? 'type': 11,
? ? ? ? 'interval_id': '100:90',
? ? ? ? 'action':'',
? ? ? ? 'start':start,
? ? ? ? 'limit': 20
? ? }
? ? url_all=url_base+urllib.parse.urlencode(url_kw)
? ? print(url_all)
? ? request=urllib.request.Request(url=url_all)
? ? response = urllib.request.urlopen(url=request)
? ? context = response.read()
? ? file_name = 'douban%s.html'%(b)
? ? with open(file_name, 'wb') as file:
? ? ? ? file.write(context)
? ? #通過解碼得到字符串
? ? ret1 = context.decode('utf-8')
? ? #因?yàn)閠rue與前端的True,沖突無法解析,所以要替換
? ? ret2 = ret1.replace('true','True').replace('false','False')
? ? ret3 = eval(ret2)
? ? print(ret3)
? ? print(len(ret3))
? ? if ret3!=[]:
? ? ? ? with open(file_name, 'w',encoding='utf-8') as file:
? ? ? ? ? ? for i in ret3:
? ? ? ? ? ? ? ? file.write(str(i)+'\n')
? ? ? ? start=start+20
? ? ? ? b+=1
? ? else:
? ? ? ? break
自定義opener對象
#自定義url opener對象
import urllib.request
#創(chuàng)建一個http對象
http_handler=urllib.request.HTTPHandler(debuglevel=1)
#創(chuàng)建一個opener對象
http_opener=urllib.request.build_opener(http_handler)
request = urllib.request.Request('http://www.sina.com')
#發(fā)送請求汛骂,獲取影響
response = http_opener.open(request)
content = response.read()
with open('./12_1.html','wb') as file:
? ? file.write(content)
urllib2的異常錯誤處理
import urllib.request
?request = urllib.request.Request(url='http://www.iloveyou.com/')
try:
? ?response = urllib.request.urlopen(url=request)
? except urllib.request.URLError as ex:
? ?print(ex)
?else:
? content = response.read()
? ? ?print(content)
?print('哦了...')
print('*'*100)
# request = urllib.request.Request(url='http://www.douyu.com/Jack_Cui.html')
request = urllib.request.Request(url='https://err.taobao.com/error1.html?c=404&u=https://www.taobao.com/markddddddddddddddddddddddddets/nvzhuang/dddddddddddddddtaobaonvzhuang?spm=a21bo.2017.201867-main.1.1819dddddddddddddddsac8a9XRYCTP&r=')
try:
? ? response = urllib.request.urlopen(url=request)
except urllib.request.HTTPError as ex:
? ? print(ex)
? ? print(dir(ex))
? ? print(ex.code)
? ? print(ex.getcode())
? ? print(ex.info())
? ? print(ex.msg)
? ? print(ex.reason)
else:
? ? content = response.read()
? ? print(content)
print('哦了...')
ProxyBasicAuthHandler(代理授權(quán)驗(yàn)證)
如果我們使用之前的代碼來使用私密代理,會報(bào)HTTP?407?錯誤色迂,表示代理沒有通過身份驗(yàn)證:
urllib.request.HTTPError:?HTTP?Error?407:?Proxy?Authentication?Required
所以我們需要改寫代碼香缺,通過: ? ? ? ? ? ? ? ? ? ? ? ? ?
#?1.構(gòu)建一個附帶Auth驗(yàn)證的的ProxyHandler處理器類對象
proxyauth_handler?=?urllib.request.ProxyHandler({"http"?:?"用戶名:密碼@IP:PORT"})
#?2.通過?build_opener()方法使用這個代理Handler對象,創(chuàng)建自定義opener對象歇僧,參數(shù)包括構(gòu)建的?proxy_handler
opener?=?urllib.request.build_opener(proxyauth_handler)
#?3.構(gòu)造Request?請求
request?=?urllib.request.Request("http://www.baidu.com/")
#?4.使用自定義opener發(fā)送請求
response?=?opener.open(request)
#?5.打印響應(yīng)內(nèi)容
print(response.read())