爬蟲(chóng)之如何處理javascript按鈕點(diǎn)擊翻頁(yè)

最近寫爬蟲(chóng)的時(shí)候遇到翻頁(yè)鏈接是javascript的情況(案例頁(yè)面 http://h.bkzx.cn/country

注意左下角

訪問(wèn)這個(gè)頁(yè)面的時(shí)候,我們會(huì)發(fā)現(xiàn): 點(diǎn)擊頁(yè)碼按鈕跳轉(zhuǎn)頁(yè)面時(shí),網(wǎng)頁(yè)的 URL 并沒(méi)有發(fā)生變化,想靠直接改變url來(lái)實(shí)現(xiàn)爬蟲(chóng)翻頁(yè)是不行了。怎么辦呢?我們把鼠標(biāo)放在按鈕上,在瀏覽器(chrome)的左下角我們可以發(fā)現(xiàn) javascript:gotoPage('1') 的字樣,打開(kāi) view-source:http://h.bkzx.cn/country ,搜索一下"javascript:gotoPage",會(huì)發(fā)現(xiàn)每個(gè)按鈕都調(diào)用了這么一個(gè)叫 gotoPage的javascript 函數(shù)

頁(yè)面源代碼(局部)
Python網(wǎng)絡(luò)爬蟲(chóng)權(quán)威指南

翻開(kāi)《Python網(wǎng)絡(luò)爬蟲(chóng)權(quán)威指南(第二版)》第11章 抓取 JavaScript, 里面介紹了爬蟲(chóng)處理 Javascript的方法,一種是通過(guò)Ajax,一種是Selenium。 Selenium 功能比較強(qiáng)大,但是運(yùn)行比較慢,不得已時(shí)才用之,所以先看看通過(guò)Ajax能不能解決。

回到 頁(yè)面 view-source:http://h.bkzx.cn/country 源代碼,找到gotoPage函數(shù)

function gotoPage(index) {
        var letter = $("#letter").val();
        var query = $("#query").val();
        $.ajax({
            method: "get",
            url: "/countryList",
            data: {
                pageNo: index,
                letter: letter,
                query: query,
                continent:$("#continent").val()
            },
            success: function (data) {
                $("#itemList").html(data);
                $('html,body').animate({scrollTop: '0px'}, 0);
            }
        });
    }

其實(shí)看的很清楚了,這個(gè)翻頁(yè)函數(shù)是通過(guò)Ajax 訪問(wèn) /countryList ,主要的請(qǐng)求參數(shù)則是 pageNo, 我們?cè)囈幌?http://h.bkzx.cn/countryList?pageNo=2, 會(huì)發(fā)現(xiàn)能順利打開(kāi)第二頁(yè)。

下面的爬蟲(chóng)就很好寫了

import requests
from bs4 import BeautifulSoup
import time

countries = []
for page in range(1, 13):
    # 逐一訪問(wèn)每一頁(yè)
    res = requests.get('http://h.bkzx.cn/countryList?pageNo=' + str(page)).content
    bs = BeautifulSoup(res, features="html.parser")
    
   # 解析每一頁(yè)里的國(guó)名信息
    for contry in bs.find_all('h3'):
        countries.append(contry.string)
    time.sleep(5)

print(countries)

'''
['阿爾巴尼亞', '阿爾及利亞', '阿富汗', '阿根廷', '阿拉伯聯(lián)合酋長(zhǎng)國(guó)', '阿魯巴 (荷蘭)', '阿曼', '阿塞拜疆', '埃及', '埃塞俄比亞', '愛(ài)爾蘭 ', '愛(ài)沙尼亞', '安道爾', '安哥拉', '安圭拉 (英) ', '安提瓜和巴布達(dá)', '奧地利 ', '澳大利亞 ', '巴巴多斯', '巴布亞新幾內(nèi)亞', '巴哈馬', '巴基斯坦', '巴拉圭', '巴勒斯坦', '巴林', '巴拿馬', '巴西', '白俄羅斯', '百慕大 (英)', '保加利亞', '北馬里亞納群島 (美)  ', '貝寧', '比利時(shí)', '秘魯', '冰島', '波蘭', '波多黎各 (美) ', '波斯尼亞和黑塞哥維那', '玻利維亞', '伯利茲']
'''

是不是很容易?。??

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容