python反爬和反反爬

爬虫: 使用任何技术手段、批量获取对方数据的一种方式

反爬:使用任何技术手段、阻止别人批量获取自己的数据

反反爬:使用任何技术手段、绕过对方的反爬策略

误伤:反爬技术将普通用户识别为爬虫,如果误伤过高,效果再好也不能用

成本-反爬虫需要的人力和机器成本

初级爬虫-简单粗暴,不管服务器压力,容易弄挂网站

数据保护

失控的爬虫-由于某些情况下,忘记或者无法关闭的爬虫

商业竞争对手的爬虫  


反爬常见手段

  1. User-agent 反爬
  2. Ip访问频率限制
  3. 必须登录(账号访问频率)

 

动态网页-加大分析难度

前端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限制

阿布云 https://www.abuyun.com/

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

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值