爬虫: 使用任何技术手段、批量获取对方数据的一种方式
反爬:使用任何技术手段、阻止别人批量获取自己的数据
反反爬:使用任何技术手段、绕过对方的反爬策略
误伤:反爬技术将普通用户识别为爬虫,如果误伤过高,效果再好也不能用
成本-反爬虫需要的人力和机器成本
初级爬虫-简单粗暴,不管服务器压力,容易弄挂网站
数据保护
失控的爬虫-由于某些情况下,忘记或者无法关闭的爬虫
商业竞争对手的爬虫
反爬常见手段
- User-agent 反爬
- Ip访问频率限制
- 必须登录(账号访问频率)
动态网页-加大分析难度
前端js逻辑加密和混淆
机器学习分析爬虫行为
只请求html,不请求js和css
css代码下毒
1. User-agent反爬
#禁止Scrapy等工具的抓取
if($http_user_agent ~* (Scrapy|Curl|HttpClient|python)){
return 403;
}
#禁止非GET|HEAD|POST方式的抓取
if($request_method !~ ^(GET|HEAD|POST)$){
return 403;
}
python中有一个库 ,可以帮我们维护 User-Agent, pip install fake-useragent
from fake_useragent import UserAgent
ua = UserAgent()
print(ua.random)
输出
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1664.3 Safari/537.36
完整代码如下
import requests
from fake_useragent import UserAgent
ua = UserAgent()
headers = {
'User-Agent': ua.random
}
res = requests.get("http://www.baidu.com", headers=headers)
2. ip限制
ps: 获取 requests的文本之前用 job_list_res.text 下文用 job_list_res.content.decode('utf8'),防止编码问题
# +--------------------------
# | User: zq -
# | Version: python3.7 -
# | Time: 2020-03-17 14:52
# +--------------------------
# 通过ip代理绕过ip反爬
import requests
from scrapy import Selector
from fake_useragent import UserAgent
def get_html(url):
print("开始下载url: {}".format(url))
ua = UserAgent()
# 代理服务器
proxyHost = "http-dyn.abuyun.com"
proxyPort = "9020"
# 代理隧道验证信息
proxyUser = "HJE7D70248LR0LAD"
proxyPass = "8F03C65640B88879"
proxyMeta = "http://%(user)s:%(pass)s@%(host)s:%(port)s" % {
"host": proxyHost,
"port": proxyPort,
"user": proxyUser,
"pass": proxyPass,
}
proxies = {
"http": proxyMeta,
"https": proxyMeta,
}
headers = {
'User-Agent': ua.random
}
resp = requests.get(url, proxies=proxies, headers=headers)
# print(resp.status_code)
# print(resp.text)
return resp
if __name__ == "__main__":
for i in range(1, 30):
job_list_url = "https://www.lagou.com/zhaopin/Python/{}/?filterOption={}".format(
i,
i)
job_list_res = get_html(job_list_url)
job_list_html = job_list_res.content.decode('utf8')
sel = Selector(text=job_list_html)
all_lis = sel.xpath("//div[@id='s_position_list']//ul//li//div[@class='position']//a/@href").extract()
for url in all_lis:
success = True
while success:
try:
job_res = get_html(url)
job_html = job_res.content.decode('utf8')
job_sel = Selector(text=job_html)
# print(job_html)
print(job_sel.xpath("//div[@class='job-name']//h1/text()").extract()[0])
# 跳出循环
success = False
except Exception as e:
print("下载失败")
11-6 反爬策略之必须要有上一页
目标站: ip.zdaye.com