爬蟲搭建代理池、爬取某網站影片案例、爬取新聞案例

阿麗米熱發表於2023-03-16

一、requests模組其他引數

# 研究主題:爬取肯德基門店資訊
# 目標網址:http://www.kfc.com.cn/kfccda/storelist/index.aspx

"""
在瀏覽器的控制檯請求體中解析出來的資料
程式碼中放到data中傳送請求
cname: 
pid: 
keyword: 上海
pageIndex: 1
pageSize: 10
"""
import requests


data = {
    'cname': '',
    'pid': '',
    'keyword': '上海',
    'pageIndex': 1,
    'pageSize': 10,

}

res = requests.post('http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword', data=data, verify=False)
print(res.json())  # .json()可以解析json格式資料

"""
 傳送http請求,返回的資料會有xml格式,也有json格式
 如果res.text  >>>轉的是xml格式
 如果res.json()   >>>轉的是json格式
 
 verify=False 該引數不驗證證照,報警告,返回200
 urllib3.disable_warnings() #關閉警告
 手動攜帶證照資訊即可
"""

二、使用代理

如果使用自自身IP地址訪問,很有可能被封IP,以後就訪問不了了
那如何解決呢?我們可以使用代理IP(代理:)

設定超時,請求引數加上timeout=時間即可
異常處理:用try except 包一下即可
上傳檔案:雖然爬蟲沒有上傳檔案的需求
但是後期在開發過程中需要批次上傳檔案,這個時候需要requests模組處理
換句話說應用場景

高匿名代理和透明代理
高匿名代理:服務端拿不到真實客戶端的IP地址
透明代理:能夠拿到真實客戶端的IP地址。也能拿到代理

使用高匿名代理時候,如何拿到真實客戶端的IP地址?在請求頭中有一個引數叫X-Forward-For:''

import requests
proxies={'http':'60.167.91.34:33080'}
proxies={
    'http':'27.79.236.66:4001'
}
res = requests.post('https://wwww.cnbolgs.com',proxies=proxies)
print(res.status_code)
'上傳檔案'
import requests
files = {'file': open('美女.png', 'rb')}
respone = requests.post('http://httpbin.org/post', files=files)
print(respone.status_code)
'異常處理'
import requests
#可以檢視requests.exceptions獲取異常型別
from requests.exceptions import * 

try:
    r=requests.get('http://www.baidu.com',timeout=0.00001)
except ReadTimeout:
    print('===:')
except RequestException:
    print('Error')
'超時設定'
import requests
respone=requests.get('https://www.baidu.com',timeout=0.0001)

三、代理池搭建

  1. 訪問搭建免費的代理池>>> https://github.com/jhao104/proxy_pool

  2. 下載zip檔案到本地再解壓之後再pycharm開啟

  3. 單獨給該專案建立虛擬環境
    image

  4. 安裝依賴

pip install -r requirements.txt
  1. 修改配置
DB_CONN = 'redis://127.0.0.1:6379/0'
  1. 啟動爬蟲程式
python proxyPool.py schedule
  1. 啟動服務端
python proxyPool.py server
  1. 使用隨機免費代理
在瀏覽器位址列中搜尋http://127.0.0.1:5010/get/

image
可以獲取隨機免費代理IP,到此自己搭建代理池結束了。

四、使用隨機代理傳送請求

import requests
from requests.packages import urllib3

urllib3.disable_warnings()  # 關閉警告

res = requests.get('http://127.0.0.1:5010/get/').json()  # 獲取代理
proxies = {}
if res['https']:
    proxies['https'] = res['proxy']
else:
    proxies['http'] = res['proxy']
print(proxies)
res = requests.post('https://www.cnblogs.com', proxies=proxies, verify=False)
print(res)

開多執行緒的指令碼

from threading import Thread
import requests


def task():
    res = requests.get('http://101.43.19.239/')
    print(res.text)


for i in range(10000000):
    t = Thread(target=task)
    t.start()

五、爬取某影片網站的影片案例

import requests
import re

res = requests.get('https://www.pearvideo.com/category_loading.jsp?reqType=5&categoryId=1&start=0')
video_list = re.findall('<a href="(.*?)" class="vervideo-lilink actplay">', res.text)
for i in video_list:
    # i='video_1212452'
    video_id = i.split('_')[-1]
    real_url = 'https://www.pearvideo.com/' + i
    headers = {
        'Referer': 'https://www.pearvideo.com/video_%s' % video_id
    }
    res1 = requests.get('https://www.pearvideo.com/videoStatus.jsp?contId=%s&mrd=0.29636538326105044' % video_id,
                        headers=headers).json()

    mp4_url = res1["videoInfo"]['videos']['srcUrl']
    mp4_url = mp4_url.replace(mp4_url.split('/')[-1].split('-')[0], 'cont-%s' % video_id)
    print(mp4_url)
    res2 = requests.get(mp4_url)
    with open('./video/%s.mp4' % video_id, 'wb') as f:
        for line in res2.iter_content():
            f.write(line)

六、爬取新聞的案例

需要前提條件是有bs4、lxml模組
如果沒有就需要下載

pip install beautifulsoup4
pip install lxml
import requests
from bs4 import BeautifulSoup

res = requests.get('https://www.autohome.com.cn/all/1/#liststart')
soup = BeautifulSoup(res.text, 'html.parser')
ul_list = soup.find_all(name='ul', class_='article')
for ul in ul_list:
    li_list = ul.find_all(name='li')
    for li in li_list:
        h3 = li.find(name='h3')
        if h3:  # 不是廣告
            title = h3.text
            url = 'https:' + li.find('a').attrs['href']
            desc = li.find('p').text
            img = li.find(name='img').attrs['src']
            print('''
            新聞標題:%s
            新聞連線:%s
            新聞摘要:%s
            新聞圖片:%s
            ''' % (title, url, desc, img))

相關文章