網路爬蟲分類
- 通用網路爬蟲(搜索引擎使用,遵守robopts協議)
robots協議:網站通過robots協議告訴搜索引擎哪些頁面可以抓取,哪些頁面不能抓取,通用網路爬蟲需要遵守robots協議(君子協議)
查看網站的robots協議: https://www.baidu.com/robots.txt - 聚焦網路爬蟲:自己寫的爬蟲程式
爬取資料步驟
- 確定需要爬取的URL地址
- 由請求模塊向URL地址發出請求,并得到網站的回應
- 利用決議模塊從回應內容中提取所需資料
所需資料,保存
頁面中有其他需要繼續跟進的URL地址,則繼續第2步去發請求,如此回圈
爬蟲入門:
1.請求模塊



注意:
res.geturl() 回傳實際地址解釋:有些網頁可能會進行重定向,從而回傳另一個地址
代碼舉例:
from urllib import request
#獲得相應物件
res=request.urlopen(url='http://www.baidu.com/')
#獲取網頁源代碼(默認是位元組串,需要轉為字串)
html=res.read().decode()
#獲取實際地址
url=res.geturl()
#回傳http回應碼
code=res.getcode()
print(res)
print('='*30)
print(html)
print('='*30)
print(url)
print('='*30)
print(code)
結果:
<http.client.HTTPResponse object at 0x000001564CDFADC0>
==============================
<!DOCTYPE html><!--STATUS OK-->
<html><head><meta http-equiv="Content-Type" content="text/html;charset=utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><meta content="always" name="referrer"><meta name="theme-color" content="#2932e1"><meta name="description" content="全球領先的中文搜索引擎、致力于讓網民更便捷地獲取資訊,找到所求,百度超過千億的中文網頁資料庫,可以瞬間找到相關的搜索結果,"><link rel="shortcut icon" href="/favicon.ico" type="image/x-icon" /><link rel="search" type="application/opensearchdescription+xml" href="/content-search.xml" title="百度搜索" /><link rel="icon" sizes="any" mask href="//www.baidu.com/img/baidu_85beaf5496f291521eb75ba38eacbd87.svg">
......
==============================
http://www.baidu.com/
==============================
200
問題:

我們用于通過相關訪問的資料:
User-Agent: Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Mobile Safari/537.36
通過python爬蟲訪問的資料如下:
headers下面內容

如何改進?


代碼舉例:
from urllib import request
# 1.定義常用變數
url='http://httpbin.org/get'
headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1'}
# 2.包裝請求
req=request.Request(url=url,headers=headers)
# 3.發請求
res=request.urlopen(req)
# 4.獲取回應內容
html=res.read().decode()
print(html)
結果:
{
"args": {},
"headers": {
"Accept-Encoding": "identity",
"Host": "httpbin.org",
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1",
"X-Amzn-Trace-Id": "Root=1-6117d0cb-6a429a376d4882805141367c"
},
"origin": "222.137.196.191",
"url": "http://httpbin.org/get"
}
總結:

urllib.parse編碼
- 作用:給URL地址中查詢引數進行編碼
- 匯入方式
import urllib.parse
from urllib import parse - 示例(url不能直接識別中文,需要編碼進行轉換)
–編碼前:https://www.baidu.com/s?wd=美女
–編碼后:https://www.baidu.com/s?wd=%E7%BE%8E%E5%A5%B3

拼接url的三種方式

小練習:

代碼演示:
from urllib import request
from urllib import parse
# 1.拼接url地址
word = input('請輸入百度搜索關鍵字:')
params=parse.urlencode({'wd':word})
url='http://www.baidu.com/s?{}'.format(params)#這個url我們需要提前觀察它的結構
headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1'}
# 2.發請求獲取回應內容
req=request.Request(url=url,headers=headers)
res=request.urlopen(req)
html=res.read().decode()
print(html)
# 3.保存到本地檔案
filename=word+'.html'
with open(filename,'w',encoding='utf-8') as f:
f.write(html)
總結:

入門實戰案例:


靜態爬取一般步驟:

代碼如下:
class BaiduTiebaSpider:
def __init__(self):
self.ur1 = 'http://tieba.baidu.com/f?kw={}&pn={}'
self.headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1'}
def get_html(self,url):
req=request.Request(url=url,headers=self.headers)
res=request.urlopen(req)
html=res.read().decode()
return html
def parse_html(self):
"""決議提取資料的函式"""
pass
def save_html(self,filename,html):
with open(filename,'w',encoding='utf8') as f:
f.write(html)
def run(self):
name=input('請輸入貼吧名:')
start=int(input('請輸入起始頁:'))
end=int(input('請輸入終止頁:'))
params=parse.quote(name)
# 1.拼接url地址
for page in range(start,end+1):
pn=(page-1)*50 #根據所選貼吧url規律計算得出
url=self.ur1.format(params,pn)
html=self.get_html(url)
filename='{}_第{}頁.html'.format(name,page)
self.save_html(filename,html)
#終端列印提示
print('第%d頁抓取成功' % page)
# 控制資料抓取的頻率
time.sleep(random.randint(1,3))
test=BaiduTiebaSpider()
test.run()
結果:
請輸入貼吧名:趙麗穎
請輸入起始頁:1
請輸入終止頁:3
第1頁抓取成功
第2頁抓取成功
第3頁抓取成功
總結:

溫馨提示:
相關操作一定要在法律允許的范圍內進行!
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/294258.html
標籤:其他
