----------------------------------------------------------------------------------------------
今天我们讲如何防反爬虫
一.浏览器伪装和爬虫代理所需要使用的库
首先需要一个异常处理模块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()
二.爬取网页思路
首先获取浏览器报头,这个可以从自己的浏览器信息里找,也可以从网上搜
然后找一些代理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