2.python爬虫伪装
2016-08-15 23:45
218 查看
一. 需求:
1.由于某些网页为了不让爬虫爬,有些时候会检查浏览器头Request Header,然后直接断网不让你爬。(如煎蛋网,学完可以去试试)
2.对于爬虫的频繁操作,有时候网页可能看某一ip出现的次数太多也会将其断网。
二. 伪装浏览器头(Request Header)
先上代码:
一个一个改就行了,或者用我自己写的自动化工具,将原文复制之后跑一下,生成res.txt里面文字直接复制就可以,不用手动每个都自己改。
附上自动化工具代码:
其实一般情况下只要修改user-agent就好了,有些网站防盗链可能需要修改Referer。
三. 伪装IP
这是因为有些网页不让同一个ip对其频繁访问,于是禁止某一个ip。
法一:
可以通过修改X-Forwarded-For,伪装成多个ip来进行抓取。代码如下:
可以尝试抓取https://www.whatismyip.com/?iref=home上面的ip地址,来验证自己当前的ip。程序代码如下:
不过这种方法实际上还是使用当前的ip进行抓取,如果真正要使用别的ip要用以下方法。
法二:
对于我们使用urllib2.urlopen(url)的过程,实际上是先产生一个opener,然后用这个opener去打开网页,opener是一个OpenerDirector()类的对象,我们可以用urllib2.build_opener(ProxyHandler)来建立一个opener,里面的参数是一个handler,用来管理代理,cookies等一切乱七八糟的东西。修改ip的handler是一个ProxyHandler类的实例。
如果加入urllib2.install_opener(opener),那么urllib2的opener就是全局的,也就是说,用urllib2.urlopen()的时候用的就是这个已经被安装的opener,当然可以直接用这个opener.open(url)去打开一个url。
过程如下:
1. 生成一个处理器opener = OpenerDirector()对象。
2. 给这个处理器对象加入处理器opener.add_handler(handler)
3. 使用打开方法,即opener.open(url)
1.由于某些网页为了不让爬虫爬,有些时候会检查浏览器头Request Header,然后直接断网不让你爬。(如煎蛋网,学完可以去试试)
2.对于爬虫的频繁操作,有时候网页可能看某一ip出现的次数太多也会将其断网。
二. 伪装浏览器头(Request Header)
先上代码:
def download_html(self, url): header = {'Cookie' : 'rpln_guide=1; TIEBA_USERTYPE=26aac53c8dd34f8265bc3afb; bdshare_firstime=1454400287585; BIDUPSID=445BDAE5291A8082504B28A8B222428F; BAIDUID=9898ADD03EE8046FCEF6715C7507BCA9FG=1; PSTM=1456401045; TIEBAUID=69f9537ad7e26c90dcfeb337; BDUSS=khLY1k5ajNtUDRJRHBLc0VDbkJ1Nm8yfmlGOS01bFJ4VUI0bkFSUGNHbEltMzlYQVFBQUFBJCQAAAAAAAAAAAEAAABLl9EpSDk5MjEwOTg5OAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEgOWFdIDlhXW; BDRCVFR[feWj1Vr5u3D]=I67x6TjHwwYf0; H_PS_PSSID=1447_19860_17001_11506_20592_20848_20856_20836_20771_20781; LONGID=701601611; wise_device=0', 'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36', 'Referer' : 'http//tieba.baidu.com/p/4730677633?see_lz=1&pn=2', 'Host' : 'tieba.baidu.com', #'Accept-Encoding' : 'gzip, deflate, sdch', 'Accept-Language' : 'zh-CN,zh;q=0.8', 'Connection' : 'keep-alive', 'Accept' : 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'Upgrade-Insecure-Requests' : '1', } request = urllib2.Request(url, None, header) response = urllib2.urlopen(request) return response.read()其中header这个字典的那些乱七八糟的东西,在浏览器右键->检查->Network->左侧Name第一个点一下->右侧出现点header,如图:
一个一个改就行了,或者用我自己写的自动化工具,将原文复制之后跑一下,生成res.txt里面文字直接复制就可以,不用手动每个都自己改。
附上自动化工具代码:
if __name__ == "__main__": dic = {} while True: s = raw_input() if len(s) == 0: break list = s.split(':') key = '\'' + list[0] + '\'' value = '\'' for s in list[1:]: value += s value += '\'' + ',' dic[key] = value fout = open("res.txt", "w") for key in dic.keys(): fout.write( "%s : %s\n" %(key, dic[key]))
其实一般情况下只要修改user-agent就好了,有些网站防盗链可能需要修改Referer。
三. 伪装IP
这是因为有些网页不让同一个ip对其频繁访问,于是禁止某一个ip。
法一:
可以通过修改X-Forwarded-For,伪装成多个ip来进行抓取。代码如下:
def download_html(url): ip = ['121.31.159.197', '175.30.238.78', '124.202.247.110'] header = {'user-agent' : 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36', 'X-Forwarded-For': ip[random.randint(0, 2)]} request = urllib2.Request(url, None, header) response = urllib2.urlopen(request) return response.read()
可以尝试抓取https://www.whatismyip.com/?iref=home上面的ip地址,来验证自己当前的ip。程序代码如下:
# -*- coding: UTF-8 -*-
import random
import urllib2
from bs4 import BeautifulSoup
def parser(url, html):
data = {}
soup = BeautifulSoup(html, "html.parser")
#<div class="ip">
summary = soup.find('div', class_ = "ip")
data['summary'] = summary.get_text()
return data
def download_html(url): ip = ['121.31.159.197', '175.30.238.78', '124.202.247.110'] header = {'user-agent' : 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36', 'X-Forwarded-For': ip[random.randint(0, 2)]} request = urllib2.Request(url, None, header) response = urllib2.urlopen(request) return response.read()
def output(data):
print data['summary']
if __name__ == "__main__":
url = "https://www.whatismyip.com/"
html = download_html(url)
data = parser(url, html)
output(data)
不过这种方法实际上还是使用当前的ip进行抓取,如果真正要使用别的ip要用以下方法。
法二:
对于我们使用urllib2.urlopen(url)的过程,实际上是先产生一个opener,然后用这个opener去打开网页,opener是一个OpenerDirector()类的对象,我们可以用urllib2.build_opener(ProxyHandler)来建立一个opener,里面的参数是一个handler,用来管理代理,cookies等一切乱七八糟的东西。修改ip的handler是一个ProxyHandler类的实例。
如果加入urllib2.install_opener(opener),那么urllib2的opener就是全局的,也就是说,用urllib2.urlopen()的时候用的就是这个已经被安装的opener,当然可以直接用这个opener.open(url)去打开一个url。
过程如下:
1. 生成一个处理器opener = OpenerDirector()对象。
2. 给这个处理器对象加入处理器opener.add_handler(handler)
3. 使用打开方法,即opener.open(url)
ProxyHandler = urllib2.ProxyHandler({'https': 'http://61.191.198.174/'}) opener = urllib2.build_opener(ProxyHandler) urllib2.install_opener(opener) request = urllib2.Request(url, None, header) response = opener.open(request)但是使用这种方法,如果找不到合适的代理,是打不开网页的。
相关文章推荐
- 【网络爬虫】【python】网络爬虫(三):模拟登录——伪装浏览器登录爬取过程
- python爬虫伪装成浏览器访问
- python网络爬虫之如何伪装逃过反爬虫程序的方法
- 4.python爬虫浏览器伪装技术
- python3使用requests模块的get方法做爬虫(伪装浏览器)
- 分享:Python3伪装浏览器爬虫读取网页内容
- python通过伪装头部数据抵抗反爬虫
- Python3 爬虫--伪装
- python通过伪装头部数据抵抗反爬虫的实例
- Python3伪装浏览器爬虫读取网页内容
- python伪装浏览器爬虫
- Python伪装浏览器爬虫读取网页内容
- fake-useragent,python爬虫伪装请求头
- Python3 爬虫(二) -- 伪装浏览器
- Python 网络爬虫伪装成浏览器访问
- python-12:怎么在爬虫代码中伪装header
- python网络爬虫 - 如何伪装逃过反爬虫程序
- python3爬虫伪装代理IP
- Python实现爬虫设置代理IP和伪装成浏览器的方法分享