Python_反爬虫解决办法

反爬虫模拟浏览器

有的时候,我们爬取网页的时候,会出现403错误,因为这些网页为了防止别人恶意采集信息,所以进行了一些反爬虫的设置。
那我们就没办法了吗?当然不会!

我们先来做个测试,访问国内银行业金融机构网,爬取银行信息:

from urllib.request import urlopen, Request

url = 'http://www.cbrc.gov.cn/chinese/jrjg/index.html'    
resObj = urlopen(url)
print(resObj.read())

爬取结果:

urllib.error.HTTPError: HTTP Error 403: Forbidden

这就说明CSDN做了一些设置,来防止别人恶意爬取信息。

所以接下来,我们需要让爬虫模拟成浏览器,
任意打开一个网页,比如打开百度,然后按F12,此时会出现一个窗口,我们切换到Network标签页,然后点击Reload刷新网站,选中弹出框左侧的状态码为200de“www.baidu.com”,即下图所示:

在这里插入图片描述
往下拖动 我们会看到“User-Agent”字样的一串信息,没错这就是我们想要的东西。
我们将其复制下来,此时我们得到的信息是:“Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0”

常见模拟浏览器的信息:
1.Android

  • Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19
  • Mozilla/5.0 (Linux; U; Android 4.0.4; en-gb; GT-I9300 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30
  • Mozilla/5.0 (Linux; U; Android 2.2; en-gb; GT-P1000 Build/FROYO) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1

2.Firefox

  • Mozilla/5.0 (Windows NT 6.2; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0
  • Mozilla/5.0 (Android; Mobile; rv:14.0) Gecko/14.0 Firefox/14.0

3.Google Chrome

  • Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36
  • Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19

4.iOS

  • Mozilla/5.0 (iPad; CPU OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3

爬取银行信息:

import random
import re
from urllib.request import urlopen, Request
from urllib.error import URLError


def get_content(url):
    """获取页面内容, 反爬虫之模拟浏览器"""
    # 防止一个浏览器访问频繁被封掉
    user_agents = [
        "Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0",
        "Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19",
        "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0",
    ]
    try:
    	# 实例化时直接指定头部信息
        # reqObj = Request(url, headers={'User-Agent': user_agent})
        reqObj = Request(url)
        # 动态添加爬虫请求的头部信息, 可以后续通过add—header方法添加
        reqObj.add_header('User-Agent', random.choice(user_agents))
    except URLError as e:
        print(e)
        return None
    else:
        content = urlopen(reqObj).read().decode('utf-8').replace('\t', ' ')
        return content


def parser_content(content):
    """解析页面内容, 获取银行名称和官网URL地址"""
    # <a href="http://www.cdb.com.cn/" target="_blank" style="color:#08619D">国家开发银行</a>    
    pattern = r'<a href="(.*)" target="_blank"  style="color:#08619D">\s+(.*)\s+</a>'
    bankinfos = re.findall(pattern, content)
    if not bankinfos:
        raise Exception("没有获取符合条件的信息")
    else:
        return bankinfos


def main():
    url = "http://www.cbrc.gov.cn/chinese/jrjg/index.html"
    content = get_content(url)
    bankinfos = parser_content(content)
    with open('doc/bankinfo.txt', 'w') as f:
        # ('http://www.cdb.com.cn/', '国家开发银行\r')
        for bank in bankinfos:
            name = bank[1].rstrip()
            url = bank[0]
            # 根据正则判断银行的url地址是否合法, 如果合法才写入文件
            pattern = r'^((https|http|ftp|rtsp|mms)?:\/\/)\S+'
            if re.search(pattern, url):
                f.write('%s: %s\n' % (name, url))
            else:
                print("%s无官方网站" % (name))
        print("写入完成....")


if __name__ == '__main__':
    main()

将银行信息写入文件bankinfo.txt中:
在这里插入图片描述

反爬虫设置代理

IP代理

1.为什么要使用IP代理?
为了防止IP访问频繁而被封掉
2.如何防止IP被封?

  • 设置延迟:time.sleep(random.randint(1,3));
  • 使用IP代理,让其他的IP代替你的IP访问页面;

3.如何获取代理IP?
https://www.xicidaili.com/ (西刺代理网站提供)

  • ProxyHandler ----> Request()
  • Opener ----> urlopen()
  • 安装Opener

4.如何检测代理是否成功?
测试网址:http://httpbin.org/get

5.案例:

from urllib.request import ProxyHandler, build_opener, install_opener, urlopen


def use_proxy(proxies, url):
    # 1. 调用urllib.request.ProxyHandler
    proxy_support = ProxyHandler(proxies=proxies)
    # 2. Opener 类似于urlopen
    opener = build_opener(proxy_support)
    # 3. 安装Opener
    install_opener(opener)

    user_agent = "Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0"
    # 模拟浏览器
    opener.addheaders = [('User-agent', user_agent)]
    urlObj = urlopen(url)
    content = urlObj.read().decode('utf-8')
    return content



if __name__ == '__main__':
    url = 'http://httpbin.org/get'
    proxies = {'http':'111.177.171.187:9999','https':'110.52.235.236:9999'}
    use_proxy(proxies, url)

在这里插入图片描述

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值