Python網絡爬蟲html |
做者:songyifeipython 歸檔:學習筆記mysql 2019/02/26web
|
快捷鍵:ajax Ctrl + 1 標題1redis Ctrl + 2 標題2sql Ctrl + 3 標題3瀏覽器 Ctrl + 4 實例服務器 Ctrl + 5 程序代碼cookie Ctrl + 6 正文 |
格式說明: 藍色字體:註釋 黃色背景:重要 綠色背景:注意 |
通用爬蟲是搜索引擎BaiDu Google YaHoo等,抓取的重要組成部分,主要目的是將互聯網上的網頁下載到本地,造成一個互聯網內容的鏡像備份。
是根據指定的需求抓取網絡上的數據
本身的門戶網站中的指定頁面中的數據不想讓爬蟲程序取到的化,那麼則能夠經過編寫一個robots.txt的協議文件來約束爬蟲程序的數據爬取
門戶網站經過相應的策略和技術手段,放置爬蟲程序進行網站數據的爬取
爬蟲程序經過相應的策略和技術的手段,破解門戶網站的反爬蟲手段,從而爬取到相應的數據
Jupyter Notebook是基於網頁的用於交互式計算的應用程序,期可被應用用全過程編碼開發,文檔編寫,運行代碼和展現結果
Jupyter Notebook的主要特色
安裝前提:
安裝Jupter Noteboo的前提須要安裝python3.3版本或2.7以上的版本
使用Anaconda安裝
經過安裝Anacida來解決Jupter NoteBoo的安裝問題
官方下載地址: www.anaconda.com/download 自行下載,傻瓜式安裝,默認配置環境變量
運行Jupyter Notebook
Jupyter notebook
經常使用快捷鍵
向下插入一個cell b
向上插入一個cell a
將cell的類型切換成Markdown類型 m
將cell的類型切換成code類型 y
運行 shift + enter
幫助文檔 Shift + Tab
補全 tab
Python中自帶的一個基於爬蟲的模塊。
做用:可使用代碼模擬瀏覽器發起請求.request parse
使用流程:
指定url
發起請求
獲取頁面數據
持久化存儲
實例3-1 需求 爬取搜狗首頁數據
#需求爬取搜狗首頁
import urllib.request
#1.指定url
url = 'https://www.sogou.com/'
#2.發請求,urlopen能夠根據指定的url發起請求,且返回一個響應對象
response = urllib.request.urlopen(url=url)
#3.獲取頁面數據:read函數返回的就是響應對象中存儲的頁面數據(byte)
page_text = response.read()
#4.持久化存儲
with open('./sogou.html','wb') as fp:
fp.write(page_text)
print('寫入數據成功')
#需求:爬取指定詞條所對應的頁面數據
import urllib.request
import urllib.parse
#指定url
url = 'https://www.sogou.com/web?query='
#url的特性:url不能夠存在非ASCII編碼的字符數據
word = urllib.parse.quote('范冰冰')
url += word #有效的url
#發送請求
response = urllib.request.urlopen(url=url)
#獲取頁面數據
page_text = response.read()
print(page_text)
#將獲取的數據作持久化存儲
page_text = response.read()
with open('fanbingbing.html','wb') as fp:
fp.write(page_text)
print('寫入成功')
-反爬蟲機制:網站會檢查請求的UA,若是發現請求的UA是爬蟲程序,則拒絕提供網站數據
-User-Agent(UA):請求載體的身份標識
-反反爬機制:假裝爬蟲程序請求的UA,
實例3-2 UA假裝
import urllib.request
url = 'http://www.baidu.com/'
#UA假裝
#1.自制定一個請求的對象
headers = {
#存儲任意的請求頭信息
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
}
#該請求對象的UA進行了成功的假裝
request = urllib.request.Request(url=url,headers=headers)
#2.針對自制定的請求對象發起請求
response = urllib.request.urlopen(request)
print(response.read())
import urllib.request
import urllib.parse
#指定url
url = 'https://fanyi.baidu.com/sug'
#post請求攜帶的參數進行處理 流程:
#1.將POST 請求參數封裝到字典
data = {
'kw':'西瓜'
}
#2。使用parse模塊中的urlencode(返回值類型爲str)進行編碼處理
data = urllib.parse.urlencode(data)
type(data)
#3.將步驟2的編碼結果轉換成byte類型
data = data.encode()
#2.發起post請求:urlopen函數的data參數表示的就是通過處理以後的post請求攜帶的參數
response = urllib.request.urlopen(url=url,data=data)
response.read()
什麼是代理:代理就是第三方代替本體處理相關
代理分類:
正向代理:代理客戶端獲取數據,正向代理是爲了保護客戶端防止被追究責任
反響代理:代理服務端提供數據,反向代理爲了保護服務器或負載均衡
一、 什麼是requests模塊
Python原生一個基於網絡請求的模塊,模擬瀏覽器發起請求。
二、 爲何要使用requests模塊
建立一個cookiejar對象
建立一個handler對象
建立一個openrner
建立一個handler對象,代理IP和端口封裝到該對象
建立openner對象
3.requests如何被使用
安裝:pip install requests
使用流程:
實例3-3 —爬取搜狗首頁
import requests
url = 'https://www.sogou.com/'
#發起get請求:get 方法會返回請求成功後的響應對象
response = requests.get(url=url)
#獲取響應中的數據值,text能夠獲取響應對象中的字符串形式頁面的數據
page_data = response.text
print(page_data)
#持久化操做
with open('./sogou.html','w',encoding='utf-8') as fp:
fp.write(page_data)
實例3-4 Response對象中其餘重要的屬性
#response對象中其餘重要的屬性
import requests
url = 'https://www.sogou.com/'
#發起get請求:get 方法會返回請求成功後的響應對象
response = requests.get(url=url)
#獲取響應中的數據值,text能夠獲取響應對象中的字符串形式頁面的數據
#content獲取的是response對象中二進制類型的數據
# print (response.content)
#返回一個狀態碼
#print(response.status_code)
#返回相應頭信息
# print(response.headers)
#獲取請求的url
print(response.url)
實例3-5 Requests如何請求攜帶參數的get請求
-方式一
方式二
實例3-6 Requsts模塊get請求自定義請求頭信息
#自定義請求頭信息
import requests
url = 'https://sogou.com/web'
#將參數封裝到字典中
params = {
'query':'周杰倫',
'ie':'utf-8'
}
#自定義請求頭信息
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
}
response = requests.get(url=url,params=params,headers=headers)
response.status_code
實例3-7 基於requests模塊發起的post請求
#基於requests模塊發起的post請求
#- 需求:登錄豆瓣網,獲取登錄成功後的頁面數據
import requests
url = 'https://accounts.douban.com/login'
#封裝post請求的參數
data = {
'source':'movie',
'redir':'https://movie.douban.com/',
'form_email':'18401747334',
'form_password':'fei@163.com',
'login':'登陸',
}
#自定義請求頭信息
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
}
#發起post請求
respomse = requests.post(url=url,data=data,headers=headers)
#獲取響應對象中的頁面數據
page_text = respomse.text
#持久化
with open('./douban.html','w',encoding='utf-8') as fp:
fp.write(page_text)
實例3-8 Requests模塊ajax的get請求、
#基於ajax的get請求
import requests
url = 'https://movie.douban.com/j/chart/top_list?'
#封裝ajax的get請求中攜帶的參數
params = {
'type': '13',
'interval_id': '100:90',
'action': '',
'start': '10',
'limit': '20'
}
#請求頭信息
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
}
respomse = requests.get(url=url,params=params,headers=headers)
print(respomse.text)
實例3-9 基於ajax的post請求
#基於ajax的post請求
#需求:爬取肯德基城市餐廳位置數據
import requests
#指定url
post_url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
#post請求的參數
data = {
'cname': '',
'pid': '',
'keyword': '杭州',
'pageIndex': '1',
'pageSize': '10'
}
#自定義請求頭
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
}
#發起基於ajax的post請求
response = requests.post(url=post_url,headers=headers,data=data)
response.text
## 獲取前3頁
import requests
import os
#建立文件夾
if not os.path.exists('./pages'):
os.mkdir('./pages')
word = input('enter a word:')
#動態指定頁碼的範圍
start_pagenum = int(input('enter a start pageNum:'))
end_pageNum = int(input('enter a end pageNum:'))
#請求頭信息
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
}
#指定url,設計成一個具備通用的url
url = 'https://zhihu.sogou.com/zhihu'
for page in range(start_pagenum,end_pageNum+1):
param = {
'query':word,
'page':page,
'ie':'utf-8'
}
response = requests.get(url=url,params=params,headers=headers)
#獲取相應中的頁面數據(指定頁面(page))
page_text = respomse.text
#持久化
fileName = word +str(page)+'.html'
filePath = 'pages/'+fileName
with open(filePath,'w',encoding='utf-8') as fp:
fp.write(page_text)
print('第%d頁寫入成功'%page)
實例3-10 Requests – cookie
--cookie
基於用戶的用戶數據
-需求:爬取張三用戶的豆瓣網上的我的主頁頁面數據
--cookie做用:
1.執行登錄操做(獲取cookie)
2.在發起我的主頁請求時,須要將cookie攜帶到請求中
注意:session對象:發送請求
-代理操做:
爲何使用代理?
- 反爬操做
- 反反爬蟲手段
分類:
正向代理:代替客戶端獲取數據
反向代理:代理服務端提供數據
免費代理ip的網站提供商
快代理
西祠代理
指定url
發起請求
獲取數據
數據解析
持久化存儲
正則
Bs4
Xpath
安裝xpath插件:就能夠直接將xpath表達式做用於瀏覽器的網頁當中
實例5-1
#建立爬蟲項目
#建立爬蟲文件
#編寫爬蟲文件
修改setting的19行的AU和22行的ROBOTSTXT_OBEY默認是true 改爲False不讓他遵循ROBOTS協議
啓動>scrapy crawl qiubai –nolog
持久化存儲操做
A 磁盤文件
基於終端指令:
保證parse方法返回一個可迭代類型的對象(存儲解析到頁面內容)
使用終端指令完成數據存儲到指定的文件當中
-o 指定的磁盤文件 –nolog 不輸出日誌
實例5-2 基於管道的數據存儲