python學(xué)習(xí)(re0)day 3
2019/6/26
一、前言
今天是正式學(xué)習(xí)爬蟲(chóng)的第一天
二、學(xué)習(xí)內(nèi)容
一 爬蟲(chóng)原理
1.什么是互聯(lián)網(wǎng)? 指的是由一堆網(wǎng)絡(luò)設(shè)備,把一臺(tái)臺(tái)的計(jì)算機(jī)互聯(lián)網(wǎng)到一起稱(chēng)之為互聯(lián)網(wǎng)。
2.互聯(lián)網(wǎng)建立的目的?
互聯(lián)網(wǎng)建立的目的是為了數(shù)據(jù)的傳遞以及數(shù)據(jù)的共享。
3.什么是數(shù)據(jù)?
例如淘寶、京東商品信息等...
東方財(cái)富、雪球網(wǎng)的一些證券投資信息...
鏈家、自如等房源信息....
12306的票務(wù)信息...
4.上網(wǎng)的全過(guò)程:
- 普通用戶(hù):
打開(kāi)瀏覽器 ——> 往目標(biāo)站點(diǎn)發(fā)送請(qǐng)求 ——> 獲取響應(yīng)數(shù)據(jù) ——> 渲染到瀏覽器中
- 爬蟲(chóng)程序:
模擬瀏覽器 ——> 往目標(biāo)站點(diǎn)發(fā)送請(qǐng)求 ——> 獲取響應(yīng)數(shù)據(jù) ——> 提取有價(jià)值的數(shù)據(jù) ——> 持久化到數(shù)據(jù)中
5.瀏覽器發(fā)送的是什么請(qǐng)求?
http協(xié)議的請(qǐng)求。
- 客戶(hù)端:
瀏覽器是一個(gè)軟件 --> 客戶(hù)端的 IP 和 端口
- 服務(wù)端
https://www.jd.com/
www.jd.com(京東域名)-> DNS解析 -> 京東服務(wù)端的 IP 和 端口
客戶(hù)端的ip和端口 ------> 服務(wù)端的 IP 和 端口 發(fā)送請(qǐng)求可以建立鏈接獲取相應(yīng)數(shù)據(jù)。
6.爬蟲(chóng)的全過(guò)程
- 發(fā)送請(qǐng)求 (需要請(qǐng)求庫(kù): Requests請(qǐng)求庫(kù)、Selenium請(qǐng)求庫(kù))
- 獲取響應(yīng)數(shù)據(jù) (只要往服務(wù)器發(fā)送請(qǐng)求,請(qǐng)求通過(guò)后會(huì)返回響應(yīng)數(shù)據(jù))
- 解析并提取數(shù)據(jù)(需要解析庫(kù): re、BeautifulSoup4、Xpath...)
- 保存到本地 (文件處理、數(shù)據(jù)庫(kù)、MongoDB存儲(chǔ)庫(kù))
二 Requests請(qǐng)求庫(kù)
1.安裝與使用
- 打開(kāi)cmd
- 輸入: pip3 install requests
2.爬取視頻
3.抓包分析
打開(kāi)瀏覽器的開(kāi)發(fā)者模式(檢查)----> 選中network
找到訪問(wèn)的頁(yè)面后綴 xxx.html(響應(yīng)文本)
1)請(qǐng)求url(訪問(wèn)的網(wǎng)站地址)
2)請(qǐng)求方式:
GET:
直接發(fā)送請(qǐng)求獲取數(shù)據(jù)
http://www.rzrgm.cn/kermitjam/articles/9692597.html
POST:
需要攜帶用戶(hù)信息往目標(biāo)地址發(fā)送請(qǐng)求
http://www.rzrgm.cn/login
3) 響應(yīng)狀態(tài)碼:
2xx: 成功
3xx: 重定向
4xx: 找不到資源
5xx: 服務(wù)器錯(cuò)誤
4) 請(qǐng)求頭信息:
User-Agent: 用戶(hù)代理(證明是通過(guò)電腦設(shè)備及瀏覽器發(fā)送的請(qǐng)求)
Cookies: 登錄用戶(hù)真實(shí)信息(證明你目標(biāo)網(wǎng)站的用戶(hù))
Referer: 上一次訪問(wèn)的url (證明你是從目標(biāo)網(wǎng)站跳轉(zhuǎn)過(guò)來(lái)的)
5)請(qǐng)求體:
POST請(qǐng)求才會(huì)有請(qǐng)求體。
Form Data
{
'user': 'tank',
'pwd': '123'
}
三 爬取梨視頻
res_list=re.findall('<a href="video_(.*?)"',response.text,re.S) #print(res_list) for v_id in res_list: detail_url='https://www.pearvideo.com/video_'+v_id print(detail_url) response=requests.get(url=detail_url) print(response.text) video_url=re.findall('srcUrl="(.*?)"',response.text,re.S)[0] print(video_url) video_name=re.findall('<h1 class="video-tt">(.*?)</h1>',response.text,re.S)[0] print(video_name) v_response = requests.get(video_url) with open('%s.mp4' % video_name,'wb')as f: f.write(v_response.content) print(video_name,'success!')
四 爬取豆瓣電影
'''''' ''' https://movie.douban.com/top250?start=0&filter= https://movie.douban.com/top250?start=25&filter= https://movie.douban.com/top250?start=50&filter= 1.發(fā)送請(qǐng)求 2.解析數(shù)據(jù) 3.保存數(shù)據(jù) ''' import requests import re # 爬蟲(chóng)三部曲 # 1.發(fā)送請(qǐng)求 def get_page(base_url): response = requests.get(base_url) return response # 2.解析文本 def parse_index(text): res = re.findall('<div class="item">.*?<em class="">(.*?)</em>.*?<a href="(.*?)">.*?<span class="title">(.*?)</span>.*?導(dǎo)演:(.*?)</p>.*?<span class="rating_num".*?>(.*?)</span>.*?<span>(.*?)人評(píng)價(jià)</span>.*?<span class="inq">(.*?)</span>', text, re.S) # print(res) return res # 3.保存數(shù)據(jù) def save_data(data): with open('douban.txt', 'a', encoding='utf-8') as f: f.write(data) # main + 回車(chē)鍵 if __name__ == '__main__': # num = 10 # base_url = 'https://movie.douban.com/top250?start={}&filter='.format(num) num = 0 for line in range(10): base_url = f'https://movie.douban.com/top250?start={num}&filter=' num += 25 print(base_url) # 1.發(fā)送請(qǐng)求,調(diào)用函數(shù) response = get_page(base_url) # 2.解析文本 movie_list = parse_index(response.text) # 3.保存數(shù)據(jù) # 數(shù)據(jù)的格式化 for movie in movie_list: # print(movie) # 解壓賦值 # 電影排名、電影url、電影名稱(chēng)、導(dǎo)演 - 主演 - 類(lèi)型、電影評(píng)分、評(píng)價(jià)人數(shù)、電影簡(jiǎn)介 v_top, v_url, v_name, v_daoyan, v_point, v_num, v_desc = movie # v_top = movie[0] # v_url = movie[1] moive_content = f''' 電影排名: {v_top} 電影url: {v_url} 電影名稱(chēng): {v_name} 導(dǎo)演主演: {v_daoyan} 電影評(píng)分: {v_point} 評(píng)價(jià)人數(shù): {v_num} 電影簡(jiǎn)介: {v_desc} \n ''' print(moive_content) # 保存數(shù)據(jù) save_data(moive_content)
浙公網(wǎng)安備 33010602011771號(hào)