本文详细介绍了网站的反爬虫策略,在这里把我写爬虫以来遇到的各种反爬虫策略和应对的方法总结一下。

从功能上来讲,爬虫一般分为数据采集,处理,储存三个部分。这里我们只讨论数据采集部分。

一般网站从三个方面反爬虫:用户请求的Headers,用户行为,网站目录和数据加载方式。前两种比较容易遇到,大多数网站都从这些角度来反爬虫。第三种一些应用ajax的网站会采用,这样增大了爬取的难度(防止静态爬虫使用ajax技术动态加载页面)。

1、从用户请求的Headers反爬虫是最常见的反爬虫策略。

伪装header。很多网站都会对Headers的User-Agent进行检测,还有一部分网站会对Referer进行检测(一些资源网站的防盗链就是检测Referer)。如果遇到了这类反爬虫机制,可以直接在爬虫中添加Headers,将浏览器的User-Agent复制到爬虫的Headers中;或者将Referer值修改为目标网站域名[评论:往往容易被忽略,通过对请求的抓包分析,确定referer,在程序中模拟访问请求头中添加]。对于检测Headers的反爬虫,在爬虫中修改或者添加Headers就能很好的绕过。

2、基于用户行为反爬虫

还有一部分网站是通过检测用户行为,例如同一IP短时间内多次访问同一页面,或者同一账户短时间内多次进行相同操作。[这种防爬,需要有足够多的ip来应对]

(1)、大多数网站都是前一种情况,对于这种情况,使用IP代理就可以解决。可以专门写一个爬虫,爬取网上公开的代理ip,检测后全部保存起来。有了大量代理ip后可以每请求几次更换一个ip,这在requests或者urllib中很容易做到,这样就能很容易的绕过第一种反爬虫。

编写爬虫代理:

步骤:

1.参数是一个字典{'类型':'代理ip:端口号'}

proxy_support=urllib.request.ProxyHandler({})

2.定制、创建一个opener

opener=urllib.request.build_opener(proxy_support)

3a.安装opener

urllib.request.install_opener(opener)

3b.调用opener

opener.open(url)

用大量代理随机请求目标网站,应对反爬虫

#! /usr/bin/env python3.4

#-*- coding:utf-8 -*-

#__author__ == "tyomcat"

import urllib.request

import random

import re

url='http://www.whatismyip.com.tw'

iplist=['121.193.143.249:80','112.126.65.193:80','122.96.59.104:82','115.29.98.139:9999','117.131.216.214:80','116.226.243.166:8118','101.81.22.21:8118','122.96.59.107:843']

proxy_support = urllib.request.ProxyHandler({'http':random.choice(iplist)})

opener=urllib.request.build_opener(proxy_support)

opener.addheaders=[('User-Agent','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36')]

urllib.request.install_opener(opener)

response = urllib.request.urlopen(url)

html = response.read().decode('utf-8')

pattern = re.compile('

(.*?)

.*?

(.*?)

')

iterms=re.findall(pattern,html)

for item in iterms:

print(item[0]+":"+item[1])

(2)、对于第二种情况,可以在每次请求后随机间隔几秒再进行下一次请求。有些有逻辑漏洞的网站,可以通过请求几次,退出登录,重新登录,继续请求来绕过同一账号短时间内不能多次进行相同请求的限制。[评论:对于账户做防爬限制,一般难以应对,随机几秒请求也往往可能被封,如果能有多个账户,切换使用,效果更佳]

3、动态页面的反爬虫

上述的几种情况大多都是出现在静态页面,还有一部分网站,我们需要爬取的数据是通过ajax请求得到,或者通过Java生成的。

解决方案:Selenium+PhantomJS

Selenium:自动化web测试解决方案,完全模拟真实的浏览器环境,完全模拟基本上所有的用户操作

PhantomJS :一个没有图形界面的浏览器

获取淘宝妹妹的个人详情地址:

#! /usr/bin/env python

# -*- coding:utf-8 -*-

#__author__ == "tyomcat"

from selenium import webdriver

import time

import re

drive = webdriver.PhantomJS(executable_path='phantomjs-2.1.1-linux-x86_64/bin/phantomjs')

drive.get('https://mm.taobao.com/self/model_info.htm?user_id=189942305&is_coment=false')

time.sleep(5)

pattern = re.compile(r'

.*?class="mm-p-info-cell clearfix">.*?.*?(.*?) (.*?)',re.S)

html=drive.page_source.encode('utf-8','ignore')

items=re.findall(pattern,html)

for item in items:

print item[0],'http:'+item[1]

drive.close()

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

python爬取网页防止重复内容_python解决网站的反爬虫策略总结相关推荐

  1. python爬取网页书籍名称代码_python爬取亚马逊书籍信息代码分享

    我有个需求就是抓取一些简单的书籍信息存储到mysql数据库,例如,封面图片,书名,类型,作者,简历,出版社,语种. 我比较之后,决定在亚马逊来实现我的需求. 我分析网站后发现,亚马逊有个高级搜索的功能 ...

  2. Python爬取网页所需内容+王者荣耀官网

    目标: 完成对王者荣耀游戏的所有英雄头像.皮肤等数据的内容爬取及图片下载,所涉及到的模块内容有requests.json.lxml.selenium.os等.王者荣耀英雄官网地址如下:https:// ...

  3. python爬取一张图片并保存_python爬取网页图片并保存到本地

    先把原理梳理一下:首先我们要爬取网页的代码,然后从中提取图片的地址,通过获取到的地址来下载数据,并保存在文件中,完成. 下面是具体步骤: 先确定目标,我挑选的是国服守望先锋的官网的英雄页面,我的目标是 ...

  4. 如何用python爬取网页数据,python爬取网页详细教程

    大家好,本文将围绕python怎么爬取网站所有网页展开说明,如何用python爬取网页数据是一个很多人都想弄明白的事情,想搞清楚python如何爬取网页数据需要先了解以下几个事情. 1.如何用Pyth ...

  5. python爬取图片-Python爬取网页中的图片(搜狗图片)详解

    前言 最近几天,研究了一下一直很好奇的爬虫算法.这里写一下最近几天的点点心得.下面进入正文: 你可能需要的工作环境: Python 3.6官网下载 本地下载 我们这里以sogou作为爬取的对象. 首先 ...

  6. python爬取网页公开数据_如何用Python爬取网页数据

    使用Python爬取网页数据的方法: 一.利用webbrowser.open()打开一个网站:>>> import webbrowser >>> webbrowse ...

  7. 编程python爬取网页数据教程_实例讲解Python爬取网页数据

    一.利用webbrowser.open()打开一个网站: >>> import webbrowser >>> webbrowser.open('http://i.f ...

  8. python爬取网页版QQ空间,生成词云图、柱状图、折线图(附源码)

    python爬取网页版QQ空间,生成词云图.柱状图.折线图 最近python课程学完了,琢磨着用python点什么东西,经过一番搜索,盯上了QQ空间,拿走不谢,欢迎点赞收藏,记得github给个sta ...

  9. python爬虫教程:实例讲解Python爬取网页数据

    这篇文章给大家通过实例讲解了Python爬取网页数据的步骤以及操作过程,有兴趣的朋友跟着学习下吧. 一.利用webbrowser.open()打开一个网站: >>> import w ...

最新文章

  1. python注入_Python如何考虑代码注入安全?
  2. 根据数据库连接的java.sql.Connection获取数据库名称
  3. Android --- Session ‘app’: Error Launching activity解决办法
  4. [leetcode]344.反转字符串
  5. 【ArcGIS风暴】ArcGIS中国地表覆盖数据GlobeLand30预处理(批量投影、拼接、掩膜提取)附成品下载
  6. matlab 子图title的位置_matlab 画图基本介绍
  7. 常用MIME类型,解决IIS布署后字体文件、mp4视频文件等not found 的错误
  8. 调多线程中的消息发送
  9. [ML]熵、KL散度、信息增益、互信息-学习笔记
  10. 六个问题让你更懂 React Fiber
  11. Android Arcface人脸识别sdk使用工具类
  12. 柱底反力求和lisp软件_基于AutoLisp语言的RC异形柱下独立基础验算方法与流程
  13. openldap备份与还原
  14. 广数928te_广数928te钻孔程序怎么编?
  15. 仿网易评论盖楼PHP+Mysql实现
  16. 单片机及开发板介绍(学习笔记)
  17. linux下samba服务器无法访问,解决windows7客户端无法访问Samba服务器的故障
  18. cass生成里程文件桩号不全_怎样用CASS生成里程文件,带桩号的
  19. 图片旋转90度解决的方法
  20. RxSwift之深入解析Using操作的应用和原理

热门文章

  1. 利剑无意之Dubbo 面试题
  2. hive提交命令org.apache.hadoop.yarn.exceptions.YarnRuntimeException: Error parsing application ID:
  3. 分布式文件系统之Tfs是什么?
  4. 【Java文件操作(一)】递归打印文件目录
  5. 深入理解nodejs的HTTP处理流程
  6. python arcgis批量绘图_python调用ArcGIS批量生成多环缓冲区(多边形等距离放大)...
  7. 深入理解事件循环机制
  8. JavaScript的运动——加速运动篇
  9. 【手把手教学】基于Maven构建方式使用Mybatis generator自动生成
  10. 【解题报告】Leecode 35. 搜索插入位置——Leecode刷题系列