最近寫爬蟲(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ù)


翻開(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í)', '秘魯', '冰島', '波蘭', '波多黎各 (美) ', '波斯尼亞和黑塞哥維那', '玻利維亞', '伯利茲']
'''
是不是很容易?。??