python-爬虫入门(二)

接上篇python-爬虫入门(一)

----------------------------------------------------------------------------------------------

今天我们讲如何防反爬虫


一.浏览器伪装和爬虫代理所需要使用的库

首先需要一个异常处理模块urllib.error,它可以接收urllib产生的异常信息

我们要使用的是urllib.error中的URLError函数,它会根据页面的响应情况返回一个状态码

200代表访问成功,403代表访问受阻,404就是大家经常遇到的页面不存在

爬虫其实就是程序猿之间的斗智斗勇,做爬虫的人想拿走网页的数据,做网页的不想数据被拿走,于是他就会设置一些预防措施,比如加验证码,统计你一段时间内访问的次数等来判断你是人为访问还是爬虫访问。因此我们需要做一些伪装。而基本的urlopen()函数并不能不支持验证、cookie或其他HTTP高级功能。

要使用伪装隐藏身份,需要使用的仍然是urllib库。这次使用的函数是urllib.request.build_opener()创建访问模式。addheaders方法添加报头,urllib.request.install_opener()设置访问模式。最后再使用urlopen()就可以以隐藏的身份访问页面了。

如果我们用爬虫多次访问一个页面,就可能会被发现封禁。因此我们需要使用不同的ip地址来模拟别人登陆。

爬虫代理所需要使用的函数是urllib.request.ProxyHandler()




二.爬取网页思路

首先获取浏览器报头,这个可以从自己的浏览器信息里找,也可以从网上搜

常见浏览器User-Agent大全

然后找一些代理ip使用代理

西刺代理

快代理

然后设置访问模式,就可以去爬取我们想要的信息啦




三.爬取网页详解

URLError函数的用法

import urllib.error
from urllib.request import urlopen
def openhtml(self, url):
    try:
        data = urlopen(url).read()
    except urllib.error.URLError as er:
        if hasattr(er, 'code'):
            print('er.code =', er.code)
        elif hasattr(er, 'reason'):
             print('er.reason =', er.reason)
        pass
    pass
pass

开源中国社会https://www.oschina.net,限制爬虫访问,直接访问会返回403报错


build_opener()、addheaders和install_opener()函数的用法

from urllib.request import urlopen
import urllib.request
def openhtml(self, url,header,):
    opener = urllib.request.build_opener()      #创建访问模式
    opener.addheaders = [header]                #为访问模式添加报头
    urllib.request.install_opener(opener)       #将访问模式设为全局访问模式
    urlopen(url)                                #直接使用就可以
pass

header = ("User-Agent",
          "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.22 Safari/537.36 SE 2.X MetaSr 1.0")
url = 'https://www.baidu.com/'
openhtml(url,header)


ProxyHandler()函数的用法

proxy_addr = {'HTTPS': '122.72.18.35:80'}    #以字典形式创建ip
proxy = urllib.request.ProxyHandler(proxy_addr)    #创建代理


下面来一个综合使用上述函数的小例子

import urllib
import urllib.request
import urllib.error
from urllib.request import urlopen
class Spyder(object):
    def openthml(self,url,hearder,proxy_addr):
        try:
            proxy = urllib.request.ProxyHandler(proxy_addr)
            opener = urllib.request.build_opener(proxy, urllib.request.HTTPHandler)
            opener.addheaders = [header]
            urllib.request.install_opener(opener)
            data = urlopen(url).read().decode("utf-8")
            print(data)
        except urllib.error.URLError as er:
            if hasattr(er, 'code'):
                print(er.code)
            elif hasattr(er, 'reason'):
                print(er.reason)
            pass
        pass
    pass
pass
if __name__=='__main__':
    spyder = Spyder()
    proxy_addr = {'HTTPS': '122.72.18.35:80'}
    header =  ("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.22 Safari/537.36 SE 2.X MetaSr 1.0")
    url = 'https://www.oschina.net'
    spyder.openthml(url,header,proxy_addr)
pass


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值