最近写爬虫的时候遇到翻页链接是javascript的情况(案例页面 http://h.bkzx.cn/country)
访问这个页面的时候,我们会发现: 点击页码按钮跳转页面时,网页的 URL 并没有发生变化,想靠直接改变url来实现爬虫翻页是不行了。怎么办呢?我们把鼠标放在按钮上,在浏览器(chrome)的左下角我们可以发现 javascript:gotoPage('1') 的字样,打开 view-source:http://h.bkzx.cn/country ,搜索一下"javascript:gotoPage",会发现每个按钮都调用了这么一个叫 gotoPage的javascript 函数
翻开《Python网络爬虫权威指南(第二版)》第11章 抓取 JavaScript, 里面介绍了爬虫处理 Javascript的方法,一种是通过Ajax,一种是Selenium。 Selenium 功能比较强大,但是运行比较慢,不得已时才用之,所以先看看通过Ajax能不能解决。
回到 页面 view-source:http://h.bkzx.cn/country 源代码,找到gotoPage函数
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);
}
});
}
其实看的很清楚了,这个翻页函数是通过Ajax 访问 /countryList ,主要的请求参数则是 pageNo, 我们试一下 http://h.bkzx.cn/countryList?pageNo=2, 会发现能顺利打开第二页。
下面的爬虫就很好写了
import requests
from bs4 import BeautifulSoup
import time
countries = []
for page in range(1, 13):
# 逐一访问每一页
res = requests.get('http://h.bkzx.cn/countryList?pageNo=' + str(page)).content
bs = BeautifulSoup(res, features="html.parser")
# 解析每一页里的国名信息
for contry in bs.find_all('h3'):
countries.append(contry.string)
time.sleep(5)
print(countries)
'''
['阿尔巴尼亚', '阿尔及利亚', '阿富汗', '阿根廷', '阿拉伯联合酋长国', '阿鲁巴 (荷兰)', '阿曼', '阿塞拜疆', '埃及', '埃塞俄比亚', '爱尔兰 ', '爱沙尼亚', '安道尔', '安哥拉', '安圭拉 (英) ', '安提瓜和巴布达', '奥地利 ', '澳大利亚 ', '巴巴多斯', '巴布亚新几内亚', '巴哈马', '巴基斯坦', '巴拉圭', '巴勒斯坦', '巴林', '巴拿马', '巴西', '白俄罗斯', '百慕大 (英)', '保加利亚', '北马里亚纳群岛 (美) ', '贝宁', '比利时', '秘鲁', '冰岛', '波兰', '波多黎各 (美) ', '波斯尼亚和黑塞哥维那', '玻利维亚', '伯利兹']
'''
是不是很容易啊?😄