打开Python爬虫实战练习页面限制访问频率不低于1秒_N03_Spiderbuf,可以看到页面内容是由NordPass发布的2022年全球最常用密码列表,总共20页数据。
在网页上点击右键 > 显示网页源代码,可以在HTML源码里面直接看到需要的数据,尝试翻页,发现数据依然能在HTML当中看到,而且翻页的链接也在HTML源码里面。
在人工浏览页面及翻页时,没有发现动态加载的数据,也没有觉察到有什么明显的反爬措施,这种情况我们可以根据以往的经验直接用Python写爬虫代码。
# coding=utf-8
import requests
from lxml import etree
base_url = 'http://www.spiderbuf.cn/n03/%d'
myheaders = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.164 Safari/537.36'}
max_no = 20
for i in range(1, max_no + 1):
print(i)
url = base_url % i
print(url)
html = requests.get(url, headers=myheaders).text
print(html)
f = open('./data/n03/n03_%d.html' % i, 'w', encoding='utf-8')
f.write(html)
f.close()
root = etree.HTML(html)
trs = root.xpath('//tr')
f = open('./data/n03/datan03_%d.txt' % i, 'w', encoding='utf-8')
for tr in trs:
tds = tr.xpath('./td')
s = ''
for td in tds:
s = s + str(td.xpath('string(.)')) + '|'
# s = s + str(td.text) + '|'
print(s)
if s != '':
f.write(s + '\n')
f.close()
然而运行这个代码的时候,我们会发现抓取第1页之后,后面的都会返回403,无法爬取。手动修改爬虫的URL,尝试单独爬取第1页以外的页面,发现是可以爬取的。
遇到这种情况通常就是因为爬虫目标网站对访问频率做了限制,因为我们在循环爬取翻页时的访问频率是远远高出正常人手工点击访问的频率的。
要解决这种问题也简单,我们在每次访问后暂停3-5秒即可,3-5秒是普通人手工访问能做到的频率。有些网站对访问频率要求更加严格,那就把每次访问后的暂停时间设置的更长一点。
所以我们在上面的代码中要加上延时,Python的延时代码需要借助time库来实现。
# time.sleep(3) 括号里面的参数单位默认是秒
time.sleep(3)
正常来说,我们在写爬虫代码的时候,每次访问的间隔都应该保持一定的时间,否则就容易触发到网站的反爬机制。
如果想要同时爬取所有页面但又不想被访问频率所限制,可以考虑加入代理服务器。Python requests使用代理服务器的方法可以参考E04-被屏蔽IP后使用代理服务器爬取页面 。
完整示例代码:示例代码