@【python爬虫】—爬虫报错:403访问太过频繁,禁止访问


前言

使用requests包建立访问时,正常的访问状态会返回状态代码200,但是在爬一些网站时,经常会返回403(众所周知的404代表的是网站disappear了。而403代表我们当前的IP被forbidden了)。这是因为在短时间内直接使用Get获取大量数据,会被服务器认为在对它进行攻击,所以拒绝我们的请求,自动把电脑IP封了。
因此,这里介绍两种解决办法。


方案一、请求页面的是添加headers

我们平时使用浏览器下载的图片或者是文件的时候,不论怎么下载,都不会被封,但是我们仅仅是使用爬虫,怕取了几张图片或者是查看了一两个页面就被封IP了。
其根本原因是因为我们使用get方法请求的时候没有使用header,而浏览器在访问页面的时候使用了header,所以,基于这个浏览器的实现,我们只需要在get请求中添加上header就可以了。
先定义header,以备后面使用:

headers = {
	'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'
} 

使用方式

import requests
import re
import time

headers = {
	'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'
} 

def get_one_page(url):
	response = requests.get(url, headers = headers)
	if response.status_code == 200:
		return response.content.decode('utf-8')
	return None
def parse_one_page(html):
	pattern = re.compile('<dd>.*?board-index.*?>(.*?)</i>',re.S)
	items = re.findall(pattern, html)
	print(items)

def main():
	url = 'https://maoyan.com/board/4?offset=0'
	time.sleep(1)
	html = get_one_page(url)
	parse_one_page(html)
	print(html)

main()

这样一来,目标服务器,会把爬虫的请求认为是浏览器的请求,也就不会禁止爬虫的操作了。

方案二、使用代理解决

这个方法我想大家都知道,IP被封的原因就是因为访问太过频繁,所以可以一直更换IP,这样目标服务器就不会封禁你的请求:

# 免费代理IP不能保证永久有效,如果不能用可以更新
# http://www.goubanjia.com/
proxy_list = [
    '183.95.80.102:8080',
    '123.160.31.71:8080',
    '115.231.128.79:8080',
    '166.111.77.32:80',
    '43.240.138.31:8080',
    '218.201.98.196:3128'
]

使用方式

import requests
import re
import time

headers = {
	'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'
} 
proxy_list = [
    '183.95.80.102:8080',
    '123.160.31.71:8080',
    '115.231.128.79:8080',
    '166.111.77.32:80',
    '43.240.138.31:8080',
    '218.201.98.196:3128'
]

def get_one_page(url):
	response = requests.get(url, proxies=proxy_list)
	if response.status_code == 200:
		return response.content.decode('utf-8')
	return None
def parse_one_page(html):
	pattern = re.compile('<dd>.*?board-index.*?>(.*?)</i>',re.S)
	items = re.findall(pattern, html)
	print(items)

def main():
	url = 'https://maoyan.com/board/4?offset=0'
	time.sleep(1)
	html = get_one_page(url)
	parse_one_page(html)
	print(html)

main()

总结

防止被封禁的方法还有设置延时,这种方法配合上面两种其中的一种会有更好的效果,当然了,一起使用都是没有问题的。

我是一个不专业的程序猿,欢迎一起交流。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐