python urllib爬蟲模塊使用解析
前言
網(wǎng)絡(luò)爬蟲也稱為網(wǎng)絡(luò)蜘蛛、網(wǎng)絡(luò)機器人,抓取網(wǎng)絡(luò)的數(shù)據(jù)。其實就是用Python程序模仿人點擊瀏覽器并訪問網(wǎng)站,而且模仿的越逼真越好。一般爬取數(shù)據(jù)的目的主要是用來做數(shù)據(jù)分析,或者公司項目做數(shù)據(jù)測試,公司業(yè)務(wù)所需數(shù)據(jù)。
而數(shù)據(jù)來源可以來自于公司內(nèi)部數(shù)據(jù),第三方平臺購買的數(shù)據(jù),還可以通過網(wǎng)絡(luò)爬蟲爬取數(shù)據(jù)。python在網(wǎng)絡(luò)爬蟲方向上有著成熟的請求、解析模塊,以及強大的Scrapy網(wǎng)絡(luò)爬蟲框架。
爬蟲分類
1、通用網(wǎng)絡(luò)爬蟲:搜索引擎使用,遵守robots協(xié)議(君子協(xié)議)
robots協(xié)議 :網(wǎng)站通過robots協(xié)議告訴搜索引擎哪些頁面可以抓取,哪些頁面不能抓取。https://www.taobao.com/robots.txt
2、聚焦網(wǎng)絡(luò)爬蟲 :自己寫的爬蟲程序
爬蟲爬取數(shù)據(jù)步驟
- 確定需要爬取的URL地址
- 由請求模塊向URL地址發(fā)出請求,并得到網(wǎng)站的響應(yīng)
- 從響應(yīng)內(nèi)容中提取所需數(shù)據(jù)
- 所需數(shù)據(jù),保存
- 頁面中有其他需要繼續(xù)跟進的URL地址,繼續(xù)第2步去發(fā)請求,如此循環(huán)
請求模塊
from urllib import request
request.urlopen() 向網(wǎng)站發(fā)起請求并獲取響應(yīng)對象
參數(shù):
URL:需要爬取的URL地址
timeout: 設(shè)置等待超時時間,指定時間內(nèi)未得到響應(yīng)拋出超時異常
響應(yīng)對象(response)方法
- string = response.read().decode('utf-8') 獲取響應(yīng)對象內(nèi)容(網(wǎng)頁源代碼),返回內(nèi)容為字節(jié)串bytes類型,順便需要decode轉(zhuǎn)換成string。
- url = response.geturl() 返回實際數(shù)據(jù)的URL地址
- code = response.getcode() 返回HTTP響應(yīng)碼
from urllib import request
url = 'http://www.baidu.com/'
# 向百度發(fā)請求,得到響應(yīng)對象
response = request.urlopen(url)
# 返回網(wǎng)頁源代碼
print(response.read().decode('utf-8'))
# 返回http響應(yīng)碼
print(response.getcode()) # 200
# 返回實際數(shù)據(jù)URL地址
print(response.geturl()) # http://www.baidu.com/
urllib.request.Request() 創(chuàng)建請求對象(包裝請求,重構(gòu)User-Agent,使程序更像正常人類請求)
參數(shù)
URL:請求的URL地址
headers:添加請求頭(爬蟲和反爬蟲斗爭的第一步)
使用流程
1、創(chuàng)建請求對象(重構(gòu)User-Agent)
req = urllib.request.Request(url=url,headers={'User-Agent':'Mozilla/5.0 xxxx'})
2、請求對象發(fā)起請求,獲取響應(yīng)對象(urlopen)
res = urllib.request.urlopen(req)
3、通過相應(yīng)對象獲取響應(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)建請求對象(包裝請求)
req = request.Request(url=url,headers=headers)
# 發(fā)請求,獲取響應(yīng)對象
res = request.urlopen(req)
# 讀取內(nèi)容,返回網(wǎng)頁代碼
html = res.read().decode('utf-8')
print(html)
URL地址編碼
urllib.parse.urlencode({dict})
URL地址中一個查詢參數(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地址中多個查詢參數(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('請輸入搜索內(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)頁獲取
- 輸入貼吧名稱
- 輸入起始頁
- 輸入終止頁
- 保存到本地文件:第1頁.html、第2頁.html ...
實現(xiàn)步驟
1、找URL規(guī)律
1、不同吧
2、不同頁
第1頁:http://tieba.baidu.com/f?kw=????&pn=0
第2頁:http://tieba.baidu.com/f?kw=????&pn=50
第n頁:pn=(n-1)*50
2、獲取網(wǎng)頁內(nèi)容
3、保存(本地文件、數(shù)據(jù)庫)
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('請輸入貼吧名:')
start = int(input('請輸入起始頁:'))
end = int(input('請輸入終止頁:'))
# 拼接URL地址,發(fā)請求
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 = '{}-第{}頁.html'.format(name,page)
self.write_page(filename,html)
print('第{}頁爬取成功'.format(page)) # 提示進度
time.sleep(random.randint(1,3)) # 控制爬取速度
if __name__ == '__main__':
spider = BaiduSpider()
spider.main()
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
python GUI庫圖形界面開發(fā)之PyQt5 UI主線程與耗時線程分離詳細(xì)方法實例
這篇文章主要介紹了python GUI庫圖形界面開發(fā)之PyQt5 UI主線程與耗時線程分離詳細(xì)方法實例,需要的朋友可以參考下2020-02-02
python執(zhí)行scp命令拷貝文件及文件夾到遠(yuǎn)程主機的目錄方法
今天小編就為大家分享一篇python執(zhí)行scp命令拷貝文件及文件夾到遠(yuǎn)程主機的目錄方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07
使用Python爬蟲庫BeautifulSoup遍歷文檔樹并對標(biāo)簽進行操作詳解
今天為大家介紹下Python爬蟲庫BeautifulSoup遍歷文檔樹并對標(biāo)簽進行操作的詳細(xì)方法與函數(shù)2020-01-01
解決安裝pycharm后不能執(zhí)行python腳本的問題
今天小編就為大家分享一篇解決安裝pycharm后不能執(zhí)行python腳本的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-01-01
利用python實現(xiàn)xml與數(shù)據(jù)庫讀取轉(zhuǎn)換的方法
這篇文章主要給大家介紹了關(guān)于利用python實現(xiàn)xml與數(shù)據(jù)庫讀取轉(zhuǎn)換的方法,文中通過示例代碼介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。2017-06-06
Django使用paginator插件實現(xiàn)翻頁功能的實例
今天小編就為大家分享一篇關(guān)于Django使用paginator插件實現(xiàn)翻頁功能的實例,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-10-10
python實現(xiàn)mysql的單引號字符串過濾方法
這篇文章主要介紹了python實現(xiàn)mysql的單引號字符串過濾方法,以一個較為詳細(xì)的實例形式分析了Python針對MySQL的操作及字符串過濾的技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-11-11
django model的update時auto_now不被更新的原因及解決方式
這篇文章主要介紹了django model的update時auto_now不被更新的原因及解決方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04

