针对“常见的反爬虫urllib技术分享”的完整攻略,我以下进行详细讲解。
常见反爬虫技术
在进行反爬虫时,往往会采用以下一些技术:
1. User-Agent检测
User-Agent是每个请求头中都包含的部分,一些网站会根据User-Agent来判断请求是不是爬虫所发出的。常见的反爬代码如下:
from urllib import request, error
url = 'http://www.somesite.com'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 5.1; rv:40.0) Gecko/20100101 Firefox/40.0'
}
req = request.Request(url, headers=headers)
try:
response = request.urlopen(req)
print(response.read())
except error.HTTPError as e:
print(e.reason, e.code, e.headers, sep='\n')
在上面的代码中,我们在请求头中加入了User-Agent信息,模拟浏览器的访问。这样就可以让爬虫请求看起来更像正常的访问。
2. IP代理池
有些网站会根据相同的IP地址发送的请求的频率来判断是不是爬虫。这时候可以使用代理池,换用不同的IP地址,就能够规避这个问题。常见的代理池如下:
import random
from urllib import request, error
url = 'http://www.somesite.com'
proxy_pool = [
{'http': 'http://12.34.56.78:8080'},
{'http': 'http://23.45.67.89:8080'},
# 其他IP地址
]
proxy = random.choice(proxy_pool)
print(f'Using proxy: {proxy}')
proxy_handler = request.ProxyHandler(proxy)
opener = request.build_opener(proxy_handler)
try:
response = opener.open(url)
print(response.read())
except error.HTTPError as e:
print(e.reason, e.code, e.headers, sep='\n')
在上面的代码中,我们从代理池中随机选择一个IP地址,替换掉自己的IP地址,这样就可以避免频繁请求而被识别为爬虫了。
示例说明
下面我们通过两个示例来说明对这两种反爬虫技术的应对策略。
1. User-Agent检测
我们以修正自己的请求头来模拟User-Agent检测的防范,示例代码如下:
from urllib import request, error
url = 'http://www.somesite.com'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 5.1; rv:40.0) Gecko/20100101 Firefox/40.0'
}
# 该请求头容易被识别为爬虫,我们赋值其他User-Agent种类
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299'
}
req = request.Request(url, headers=headers)
try:
response = request.urlopen(req)
print(response.read())
except error.HTTPError as e:
print(e.reason, e.code, e.headers, sep='\n')
从上述代码中,我们可以通过修改请求头中User-Agent的具体信息来避免被识别为爬虫,代码中将原代码的User-Agent修改为了Chrome,以此达到类似通过浏览器请求网站的效果。
2. IP代理池
我们以使用代理池来模拟IP代理池检测的防范,示例代码如下:
import random
from urllib import request, error
url = 'http://www.somesite.com'
proxy_pool = [
{'http': 'http://12.34.56.78:8080'},
{'http': 'http://23.45.67.89:8080'},
# 其他IP地址
]
proxy = random.choice(proxy_pool)
print(f'Using proxy: {proxy}')
proxy_handler = request.ProxyHandler(proxy)
opener = request.build_opener(proxy_handler)
try:
response = opener.open(url)
print(response.read())
except error.HTTPError as e:
print(e.reason, e.code, e.headers, sep='\n')
以上的代码中,我们创建了一个包含多组IP地址信息的代理池,其中每一组都是一个字典对象,以确保大小写不敏感性。我们通过从代理池中随机选择一组IP地址,替换方法中的原IP地址,来模拟IP代理池检测。
通过以上两个示例的案例,我们可以看到如何通过使用不同的请求头和不同的代理IP地址来绕开网站反爬虫技术。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:常见的反爬虫urllib技术分享 - Python技术站