Python中常见的反爬机制及其破解方法总结
1. 反爬机制简介
随着互联网技术的快速发展,数据量剧增,各种网络爬虫不断涌现,研究数据更成为人们的一项重要工作。然而,由于缺乏有效的反爬机制,爬虫爬取数据也变得越来越容易,因此各大网站也都升级了自己的反爬手段,以抵御爬虫。常见的反爬手段有以下几种:
- IP封禁:对频繁访问、请求量过大的IP地址进行屏蔽。
- User-Agent过滤:检查请求头中的User-Agent,对白名单以外的User-Agent进行拦截(例如,对机器人而言,User-Agent列表搜藏机器人也是一种有效的反爬手段)。
- 验证码:分布式请求时,往往需要验证码进行验证。
- 动态页面加载:Ajax和JavaScript动态加载,导致数据源地址的变化。
- 带cookie认证: 登录的session验证,不同身份的用户访问同一地址,获取到的数据不同。
2. 反爬破解方法
2.1 IP封禁
- 使用代理IP或者VPN进行请求。
- 使用多台主机,分部进行爬取,降低单个IP的访问量。
2.2 User-Agent过滤
在爬取时,我们可以通过伪装User-Agent来避免被网站禁止访问。
例如在python中,使用requests库可以设置HTTP请求头,修改User-Agent:
import requests
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.3'}
url = 'https://www.baidu.com'
response = requests.get(url, headers=headers)
2.3 验证码
在爬取时,使用分布式爬虫框架或者使用验证码识别API,通过OCR识别验证码进行验证。
2.4 动态页面加载
使用Selenium+PhantomJS进行模拟用户操作来爬取动态加载的页面。
例如,在python中使用Selenium+PhantomJS爬去淘宝搜索页面:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
browser = webdriver.PhantomJS()#PhantomJS
browser.get('https://www.taobao.com/')
elem = browser.find_element_by_name("q")#寻找淘宝搜索窗口
elem.send_keys("迅游加速器")
elem.send_keys(Keys.RETURN)#输入关键词并模拟搜索
print(browser.page_source)#返回当前页面资源代码
browser.close()
2.5 带cookie认证
在爬取时,使用requests库中的Session对象保存cookies,在下一次请求时,传递cookies。
例如,在python中,模拟登录Github账号:
import requests
# login
session = requests.Session()
login_url = 'https://github.com/login'
response_login = session.get(login_url)
# csrf token
headers_login = response_login.headers
ghs = headers_login.setdefault('Set-Cookie', '').split(';')[0]
_, csrf_token = [c.split('=')[-1] for c in headers_login['Set-Cookie'].split(';') if c.startswith('_gh_sess=') or c.startswith('user_session=')]
headers_login['Cookie'] = ghs
headers_login['Referer'] = 'https://github.com/'
soup = bs4.BeautifulSoup(response_login.content)
form = soup.find('form')
inputs = form.find_all('input')
for _input in inputs:
if _input.get('name') == 'commit':
submit_value = _input.get('value')
if _input.get('name') == 'utf8':
utf8_value = _input.get('value')
continue
headers_login.setdefault(_input.get('name'), _input.get('value'))
headers_login.pop('None', None)
headers_login.update({
'Host': 'github.com',
'Origin': 'https://github.com',
'Referer': 'https://github.com/login',
})
headers_login['Accept-Language'] = 'en-US,en;q=0.8'
headers_login['Content-Type'] = 'application/x-www-form-urlencoded'
data_login = {x.get('name'): x.get('value') for x in form.find_all('input')}
post_url = 'https://github.com/session'
response_post = session.post(post_url, headers=headers_login, data=data_login)
# enter the homepage of our own
entry = session.get('https://github.com/settings/profile').text
以上就是Python中常见的反爬机制及其破解方法的总结,当然,不同网站的反爬手段各不相同,所以在你的爬虫实现中也需要根据具体情况来处理。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python中常见的反爬机制及其破解方法总结 - Python技术站