分析ajax爬取果壳网
一、確定要爬取的網(wǎng)頁
? ? ? ? 首先選擇要爬取的網(wǎng)頁,我要爬取的是果殼網(wǎng),url為:https://www.guokr.com/scientific/
爬取每篇文章的標(biāo)題、名字、作者、發(fā)布時間等信息
??
二、分析網(wǎng)頁
? ? ? 我們每次往下拉的時候都會有源源不斷的文章出來,而我們在分析該網(wǎng)頁的時候新文章的HTML也是我們往下拉的時候出現(xiàn)的,那么恭喜你了,這個網(wǎng)站的數(shù)據(jù)放在ajax中了,聽到這里就有人覺得麻煩了,以前爬取的數(shù)據(jù)都是固定的,requests請求后就可以直接分析了,其實(shí)ajax并不難,我們只要找到ajax的地址和其中的參數(shù)即可,為什么這么說呢?因?yàn)槊看瓮吕臅r候,ajax每次會都有固定文章出現(xiàn),這其中肯定有相對應(yīng)的參數(shù)來控制的,我們只要分析這個ajax的url就好了,把其固定不變的截取下來,而改變的參數(shù)則我們來傳參
? ? ? ?下面這個文件就是我們要找的ajax地址了,點(diǎn)擊進(jìn)去看下
? ? ? ?看下我們的headers,分析我們請求的url,然后得出結(jié)論
固定的是 ? ?https://www.guokr.com/apis/minisite/article.json??
有三個參數(shù),分別是retrieve_type、limit、offset,經(jīng)過多次對比,發(fā)現(xiàn)就是offset一直再改變,所以前面兩個參數(shù)寫死,后面的根據(jù)參數(shù)來改變,開始的時候有18篇文章,而每次ajax會加載出20篇,所以就可以得到offset的值了
三、 分析出每篇文章的url
我們看到每個ajax中都放了20條數(shù)據(jù),數(shù)據(jù)都在result的東西里面
點(diǎn)開這個result,在最下面找到了我們要的url,這里需要記住最重要的一點(diǎn),得到的ajax的格式都是json格式的
四、分析每篇文件的url,找到需要的數(shù)據(jù)的位置
隨便點(diǎn)開一篇文章,根據(jù)分析,發(fā)現(xiàn)所有的數(shù)據(jù)都放在這個div中,只需得到這個div,然后進(jìn)一步分析得到里面的數(shù)據(jù)
五、代碼
import requests from bs4 import BeautifulSoup# 得到每個offset值 def off_set():offset = 18# 先取99個ajax,for i in range(1,100):if i == 1:parse_url(offset)else:offset = limit + offsetparse_url(offset)# 將得到的offset傳入 def parse_url(offset):# 帶參傳遞data = {'retrieve_type':'by_subject','limit':'20','offset':offset}# 請求這個ajax地址response = requests.get(start_ajax,params=data,headers=headers)# 得到的數(shù)據(jù)是個json格式,所以用requests自帶的json函數(shù)來解析它ajax_data=response.json()# 解析得到每篇文章的url,因?yàn)閍jax是個字典格式,而其中result的值卻是個列表,所以要用[0]取出lst=ajax_data['result']for i in lst:url = i['url']print(url)parse(url)def parse(url):html = requests.get(url,headers=headers)html = html.textsoup = BeautifulSoup(html,'lxml')data = soup.find_all('div',class_='content-th')for i in data:title = i.find_all('a')[0].textname = i.find_all('h1')[0].text.split()[0]zuoze = i.find_all('div','content-th-info')[0].find_all('a')[0].texttime = i.find_all('div','content-th-info')[0].find_all('meta')[0]['content']print('{}\t\t{}\t\t{}\t\t{}'.format(title,name,zuoze,time))if __name__ == '__main__':start_ajax = 'https://www.guokr.com/apis/minisite/article.json?'headers = {'User-Agent': 'Mozilla/4.0(compatible;MSIE 5.5;Windows NT)', }# 每個offset都是以18為基數(shù),每次疊加20limit = 20off_set()運(yùn)行結(jié)果:
就這樣得到了我們要的結(jié)果,當(dāng)然你要其它數(shù)據(jù)可以自己寫,我只想告訴你們?nèi)绾稳ソ馕鯽jax文件
總結(jié)
以上是生活随笔為你收集整理的分析ajax爬取果壳网的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: FATAL ERROR: MarkCom
- 下一篇: 支付宝RSA2公钥证书生成办法