前言
我們看了一些,爬蟲示例,對爬蟲應該有比較深的理解了,
還是爬取評論,這次選擇B站
點開B站,打開F12,點擊評論,看ajax,觀察規律,找到url
image.png
找到url,很容易
image.png
多抓取幾次,相互比較,得出規律,然后對url縮減
https://api.bilibili.com/x/v2/reply?jsonp=jsonp&pn=2&type=1&oid=12009509&sort=0
然后測試返回的類型,是src,我們轉為dict,根據key=value獲得我們需要的數據
代碼
import requests
#獲取評論
for page in range(10):#評論的頁數
url = 'https://api.bilibili.com/x/v2/reply?jsonp=jsonp&pn={page}&type=1&oid=12009509&sort=0'.format(page=page)
resp = requests.get(url)
data = resp.json()
comment_list = data['data']['replies']
for com in comment_list:
comment = com['content']['message']
print(comment)
大概思路就是這樣的,具體細節,自己完善。
爬蟲之魂
我們都知道,用機器去爬取信息和人為的瀏覽信息是有很大的不同的。所以,網站也會經常封鎖我們的爬蟲,對此,我們常用的策略是偽裝成瀏覽器,降低訪問頻率,讓爬蟲的行為更像人為的瀏覽。當然如果只是偽裝成瀏覽器,降低了你的訪問速度,網站仍然會封鎖你的爬蟲。讓你訪問受限,比如,訪問十次該網址,就封鎖,導致出錯,但是,過一段時間,我們重新運行程序又可以爬取數據了。所以,為了減少麻煩,我們可以設置策略:
當我們知道自己的爬蟲被封鎖了以后,降低訪問頻率,但是還是要一直發送請求,鍥而不舍,直到又可以爬取為止。堅持就是勝利。
偽裝成瀏覽器
import requests
def scraper(url):
headers = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36'}
cookies = {'Cookie':'你的cookies'}
resp = requests.get(url,headers,cookies)
"""省略。。。解析網頁"""
"""省略。。。保存數據"""
#待爬urls
urls = [...]
for url in urls:
scraper(url)
降低訪問頻率
import requests
import time
def scraper(url):
headers = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36'}
cookies = {'Cookie':'你的cookies'}
resp = requests.get(url,headers,cookies)
"""省略。。。解析網頁"""
"""省略。。。保存數據"""
#待爬urls
urls = [...]
for url in urls:
scraper(url)
time.sleep(1)
鍥而不舍
import requests
import time
def scraper(url):
headers = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36'}
cookies = {'Cookie':'你的cookies'}
resp = requests.get(url,headers,cookies)
"""省略。。。解析網頁"""
"""省略。。。保存數據"""
#擁有鍥而不舍精神的爬蟲(slow but steady)
def scraper_with_perseverance(url):
Flag = True
while Flag:
try:
#正常爬取,爬取成功后退出循環
scraper(url)
Flag = False
except:
#被網站封鎖后,降低訪問頻率,但仍堅持重復訪問,
#直到爬取到該url的數據,退出本url的爬蟲
Flag = True
time.sleep(5)
#待爬urls
urls = [...]
for url in urls:
scraper_with_perseverance(url)
time.sleep(1)
tips
如果爬的還是太多,建議使用代理IP
推薦
fake-useragent庫,可以偽裝生成headers請求頭中的User Agent值
安裝pip install fake-useragent
使用功能random方法
image.png
爬蟲中使用
from fake_useragent import UserAgent
import requests
ua = UserAgent()
headers = {'User-Agent': ua.random}
url = '待爬取的url'
resp = requests.get(url,headers=headers)