您好,登錄后才能下訂單哦!
小編這次要給大家分享的是詳解python中urllib爬蟲模塊,文章內(nèi)容豐富,感興趣的小伙伴可以來(lái)了解一下,希望大家閱讀完這篇文章之后能夠有所收獲。
前言
網(wǎng)絡(luò)爬蟲也稱為網(wǎng)絡(luò)蜘蛛、網(wǎng)絡(luò)機(jī)器人,抓取網(wǎng)絡(luò)的數(shù)據(jù)。其實(shí)就是用Python程序模仿人點(diǎn)擊瀏覽器并訪問(wèn)網(wǎng)站,而且模仿的越逼真越好。一般爬取數(shù)據(jù)的目的主要是用來(lái)做數(shù)據(jù)分析,或者公司項(xiàng)目做數(shù)據(jù)測(cè)試,公司業(yè)務(wù)所需數(shù)據(jù)。
而數(shù)據(jù)來(lái)源可以來(lái)自于公司內(nèi)部數(shù)據(jù),第三方平臺(tái)購(gòu)買的數(shù)據(jù),還可以通過(guò)網(wǎng)絡(luò)爬蟲爬取數(shù)據(jù)。python在網(wǎng)絡(luò)爬蟲方向上有著成熟的請(qǐng)求、解析模塊,以及強(qiáng)大的Scrapy網(wǎng)絡(luò)爬蟲框架。
爬蟲分類
1、通用網(wǎng)絡(luò)爬蟲:搜索引擎使用,遵守robots協(xié)議(君子協(xié)議)
robots協(xié)議 :網(wǎng)站通過(guò)robots協(xié)議告訴搜索引擎哪些頁(yè)面可以抓取,哪些頁(yè)面不能抓取。
2、聚焦網(wǎng)絡(luò)爬蟲 :自己寫的爬蟲程序
爬蟲爬取數(shù)據(jù)步驟
請(qǐng)求模塊
from urllib import request
request.urlopen() 向網(wǎng)站發(fā)起請(qǐng)求并獲取響應(yīng)對(duì)象
參數(shù):
URL:需要爬取的URL地址
timeout: 設(shè)置等待超時(shí)時(shí)間,指定時(shí)間內(nèi)未得到響應(yīng)拋出超時(shí)異常
響應(yīng)對(duì)象(response)方法
from urllib import request url = 'http://www.baidu.com/' # 向百度發(fā)請(qǐng)求,得到響應(yīng)對(duì)象 response = request.urlopen(url) # 返回網(wǎng)頁(yè)源代碼 print(response.read().decode('utf-8')) # 返回http響應(yīng)碼 print(response.getcode()) # 200 # 返回實(shí)際數(shù)據(jù)URL地址 print(response.geturl()) # http://www.baidu.com/
urllib.request.Request() 創(chuàng)建請(qǐng)求對(duì)象(包裝請(qǐng)求,重構(gòu)User-Agent,使程序更像正常人類請(qǐng)求)
參數(shù)
URL:請(qǐng)求的URL地址
headers:添加請(qǐng)求頭(爬蟲和反爬蟲斗爭(zhēng)的第一步)
使用流程
1、創(chuàng)建請(qǐng)求對(duì)象(重構(gòu)User-Agent)
req = urllib.request.Request(url=url,headers={'User-Agent':'Mozilla/5.0 xxxx'})
2、請(qǐng)求對(duì)象發(fā)起請(qǐng)求,獲取響應(yīng)對(duì)象(urlopen)
res = urllib.request.urlopen(req)
3、通過(guò)相應(yīng)對(duì)象獲取響應(yīng)內(nèi)容
html = res.read().decode('utf-8')
from urllib import request url = 'http://httpbin.org/get' headers = {'User-Agent':'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; InfoPath.3)'} # 創(chuàng)建請(qǐng)求對(duì)象(包裝請(qǐng)求) req = request.Request(url=url,headers=headers) # 發(fā)請(qǐng)求,獲取響應(yīng)對(duì)象 res = request.urlopen(req) # 讀取內(nèi)容,返回網(wǎng)頁(yè)代碼 html = res.read().decode('utf-8') print(html)
URL地址編碼
urllib.parse.urlencode({dict})
URL地址中一個(gè)查詢參數(shù)
查詢參數(shù):{'wd' : '美女'}
urlencode編碼后:'wd=%e7%be%8e%e5%a5%b3'
from urllib import parse url = 'http://www.baidu.com/s?' query_string = parse.urlencode({'wd':'美女'}) print(query_string) # wd=%E7%BE%8E%E5%A5%B3 url = url + query_string # http://www.baidu.com/wd=%E7%BE%8E%E5%A5%B3
URL地址中多個(gè)查詢參數(shù)
from urllib import parse query_string_dict = {'wd' : '美女', 'pn' : '50'} query_string = parse.urlencode(query_string_dict) url = 'http://www.baidu.com/s?{}'.format(query_string) print(url) # http://www.baidu.com/s?wd=%E7%BE%8E%E5%A5%B3&pn=50
拼接URL地址的3種方式
1、字符串相加
'https://www.baidu.com/s?' + urlencode({'wd':'美女','pn':'50'})
2、字符串格式化(占位符)
'https://www.baidu.com/s?%s' % urlencode({'wd':'美女','pn':'50'})
3、format()方法
'https://www.baidu.com/s?{}'.format(urlencode({'wd':'美女','pn':'50'}))
示例 在百度中輸入要搜索的內(nèi)容,把響應(yīng)內(nèi)容保存到本地文件
from urllib import request from urllib import parse # 定義常用變量 word = input('請(qǐng)輸入搜索內(nèi)容:') url = 'http://www.baidu.com/s?' headers = {'User-Agent':'Mozilla/5.0'} # url編碼,拼接完整URL query_string = parse.urlencode({'wd':word}) url = url + query_string # 三步走 req = request.Request(url=url,headers=headers) res = request.urlopen(req) html = res.read().decode('utf-8') filename = '{}.html'.format(word) with open(filename,'w',encoding='utf-8') as f: f.write(html)
urllib.parse.quote(string)編碼
from urllib import parse parse.quote('美女') # %E7%BE%8E%E5%A5%B3
urllib.parse.unquote(string)解碼
from urllib import parse result = parse.unquote('%E7%BE%8E%E5%A5%B3') print(result) # 美女
百度貼吧網(wǎng)頁(yè)獲取
實(shí)現(xiàn)步驟
1、找URL規(guī)律
1、不同吧
2、不同頁(yè)
第1頁(yè):http://tieba.baidu.com/f?kw=????&pn=0
第2頁(yè):http://tieba.baidu.com/f?kw=????&pn=50
第n頁(yè):pn=(n-1)*50
2、獲取網(wǎng)頁(yè)內(nèi)容
3、保存(本地文件、數(shù)據(jù)庫(kù))
from urllib import request,parse import time import random class BaiduSpider(object): def __init__(self): self.url = 'http://tieba.baidu.com/f?kw={}&pn={}' self.headers = {'User-Agent':'Mozilla/5.0'} # 獲取響應(yīng) def get_page(self,url): req = request.Request(url=url,headers=self.headers) res = request.urlopen(req) html = res.read().decode('utf-8') return html # 保存數(shù)據(jù) def write_page(self,filename,html): with open(filename,'w') as f: f.write(html) # 主函數(shù) def main(self): name = input('請(qǐng)輸入貼吧名:') start = int(input('請(qǐng)輸入起始頁(yè):')) end = int(input('請(qǐng)輸入終止頁(yè):')) # 拼接URL地址,發(fā)請(qǐng)求 for page in range(start,end+1): pn = (page-1)*50 kw = parse.quote(name) # url編碼 url = self.url.format(kw,pn) html = self.get_page(url) # 獲取響應(yīng),并保存 filename = '{}-第{}頁(yè).html'.format(name,page) self.write_page(filename,html) print('第{}頁(yè)爬取成功'.format(page)) # 提示進(jìn)度 time.sleep(random.randint(1,3)) # 控制爬取速度 if __name__ == '__main__': spider = BaiduSpider() spider.main()
看完這篇關(guān)于詳解python中urllib爬蟲模塊的文章,如果覺得文章內(nèi)容寫得不錯(cuò)的話,可以把它分享出去給更多人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。