【python爬虫】—爬虫报错:403访问太过频繁,禁止访问
@【python爬虫】—爬虫报错:403访问太过频繁,禁止访问前言使用requests包建立访问时,正常的访问状态会返回状态代码200,但是在爬一些网站时,经常会返回403(众所周知的404代表的是网站disappear了。而403代表我们当前的IP被forbidden了)。这是因为在短时间内直接使用Get获取大量数据,会被服务器认为在对它进行攻击,所以拒绝我们的请求,自动把电脑IP封了。因此,这
@【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()
总结
防止被封禁的方法还有设置延时,这种方法配合上面两种其中的一种会有更好的效果,当然了,一起使用都是没有问题的。
我是一个不专业的程序猿,欢迎一起交流。
更多推荐
所有评论(0)