精华内容
下载资源
问答
  • 基于Python的网络爬虫与反爬虫技术的研究.pdf
  • 反爬虫技术

    千次阅读 2018-09-08 16:06:06
    1.反爬虫是因为爬虫才诞生的,想要很好的运用... 反爬虫:即为使用任何技术及手段,阻止被人 抓取自己网站信息的一种方式,关键在于批量和减少阻止过程中的误伤。 2.反爬虫是针对爬虫设计的,一般架构如下: 对请...

    1.反爬虫是因为爬虫才诞生的,想要很好的运用反爬虫,就要先清楚爬虫及爬虫机制。先了解一下爬虫,反爬虫的概念,如下:
    爬虫:使用任何技术及手段,批量抓取网站信息的一种方法,且关键在于 批量。
    反爬虫:即为使用任何技术及手段,阻止被人 抓取自己网站信息的一种方法,关键在于批量和减少阻止过程中的误伤。
    2.反爬虫是针对爬虫设计的,一般架构如下:
    对请求进行数据统计等预处理,便于识别爬虫
    识别是否是爬虫
    针对识别结果,进行适当处理
    通常网站为力避免普通用户遭到 误伤,而做不到完全的拦截爬虫机制的!
    3.目前常用的反爬虫技术

    • (1.)后台对访问进行统计,单位时间内同一IP访问的次数超过一个特定的值(阀值),就封IP。效果不是很好,不过针对三月爬虫效果还是不错的,目前用的也是很多的。
      -(2.)后台对访问的session进行统计,单位时间内同一session访问的次数超过一个特定的阀值,就封IP,同样效果不是很好,好的爬虫仍然能伪装的躲过。
    • ( 3.)后台对访问的User_Agent进行统计,单位时间内同一User_Agent访问的次数超过特定的阀值,封IP,此法效果不过,但误伤大,任何误伤大的反爬虫机制,无论效果多好,都会被谨慎使用的。
    • (4.)重要数据需账号注册登录后方可获得,同时利用js和AJAX的动态效果,只让正常登录者访问,让爬虫无法正常读取,进行发爬虫,效果相对较好。
    • (5.)对数据进行玷污处理,真假数据混合存储,不知道正确的解析方式,数据拿到手也是无用。
    • (6.)交押金,用户先交押金才能访问,当访问重要数据时扣除相应的押金,一定周期进行结算,后台根据日志,IP,User_Agent,session等进行统计分析,对于真正的用户退还押金,爬虫用户押金没收同时封IP。此法有一定的可行性,但也有诸多弊端。
      目前网站的反爬虫机制都不是以上单一的一个,再好的反爬虫机制也是不能做到完全反爬虫的,爬虫与反爬虫相爱相杀的促进技术的更新换代。
    展开全文
  • 基于Python的网络爬虫与反爬虫技术研究.pdf
  • 1.反爬虫技术 首先我们来思考一下,为什么要反爬虫? 网络中充斥大量爬虫的情况下,会使得整个网络的数据不可靠。 网站在面对高并发爬虫的攻击时,很容易被击溃。 版权数据被爬取,对于网站来说是巨大的损失。 ...

    1.反爬虫技术

    首先我们来思考一下,为什么要反爬虫?

    • 网络中充斥大量爬虫的情况下,会使得整个网络的数据不可靠。
    • 网站在面对高并发爬虫的攻击时,很容易被击溃。
    • 版权数据被爬取,对于网站来说是巨大的损失。

    基于以上原因,反爬虫技术孕育而生,主要包含以下最常用的反爬技术:

    • 封IP
      后台对访问进行统计,如果单个IP访问超过阈值,则封锁该IP。
    • 封UserAgent
      后台对访问进行统计,如果单个UserAgent访问超过阈值,则封锁该UserAgent。
    • 封Cookie
      后台对访问进行统计,如果单个cookies访问超过阈值,则封锁该cookie.
    • 设置请求时间间隔
      设置请求时间间隔,规避过于频繁的请求访问,避免爬虫短时间爬取大量数据。
    • robots.txt协议
      robots.txt是一个限制爬虫的规范,该文件是用来声明哪些东西不能被爬取; 设置robots.txt协议,位于robots.txt中的UserAgent不可请求网站数据。
    • 验证码验证
      发生大量请求时,弹出验证码验证,通过验证方可继续访问。
    • JavaScript渲染网页
      将重要信息放在网页中但不写入html标签中,而浏览器会自动渲染标签中的js代码,将信息展现在浏览器当中,而爬虫是不具备执行js代码的能力,所以无法将js事件产生的信息读取出来。
    • ajax异步传输
      访问网页的时候服务器将网页框架返回给客户端,在与客户端交互的过程中通过异步ajax技术传输数据包到客户端,呈现在网页上,爬虫直接抓取的话信息为空。
    • 网页iframe框架嵌套
      在下载框处再内嵌一个窗口,使得爬虫提取不到内层窗口的数据。

    2.反反爬虫技术

    有反爬虫技术,就会有反反爬虫技术存在,这是两种相互对抗的技术;这两种技术也在相互对抗中不断发展。

    我们在编写爬虫时,要对获取海量的免费数据心怀感恩,而不是恶意攻击网站,这是一种害人害己的形为。

    常用的反反爬虫技术有以下这些:


    • 降低请求频率
      对于基于scrapy框架构建的爬虫,在配置文件settings.py中设置DOWN-LAOD_DELAY即可。
      以下代码设置下载延迟时间为4秒,即两次请求间隔4秒。
    DWONLOAD_DELAY = 4
    

    或设置RANDOMIZE_DOWNLOAD_DELAY,定义一个随机的请求延迟时间。

    RANDOMIZE_DOWNLOAD_DELAY = True
    

    • 修改请求头
      在这里插入图片描述

    • 禁用Cookie
      有些网站会通过Cookie来发现爬虫的轨迹,如非特殊需要,禁用Cookie可以切断网站通过Cookie发现爬虫的途径。
      对于基于scrapy框架构建的爬虫,在配置文件settings.py中设置COOKIES_ENABLED即可。
    #Disable cookies (enabled by default)
    COOKIES_ENABLED = False
    

    • 伪装成不同的浏览器
      Scrapy自带专门设置User-Agent的中间件UserAgentMiddleware,在爬虫运行中,会自动将User-Agent添加到HTTP请求中,并且可以设置多个浏览器,请求时可以随机添加不同的浏览器。

    1.设定浏览器列表。
    将浏览器列表定义至settings.py文件中:

    MY_USER_AGENT = ["Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NETCLR 1.1.4322; .NET CLR 2.0.50727)", \
                     "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser;SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)", \
                     "Mozilla/4.0 (compatible; MSIE 7.0; AOL 9.5; AOLBuild 4337.35; WindowsNT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", 
                     ]
    

    2.在中间件UserAgentMiddleware中从浏览器列表中随机获取一个浏览器。

    #导入UserAgentMiddleware组件模块
    
    from scrapy.downloadermiddlewares.useragent import UserAgentMiddleware
    import random                                               #导入随机模块
    
    from qidian_hot.settings import MY_USER_AGENT       #导入浏览器列表
    
    #定义类QidianHotUserAgentMiddleware,用于设置随机设置user-agent
    #继承于UserAgentMiddleware
    
    class QidianHotUserAgentMiddleware(UserAgentMiddleware):
        #处理Request请求函数
    
        def process_request(self, request, spider):
          #使用random模块的choice函数从列表MY_USER_AGENT中随机获取一个浏览器类型
    
          agent = random.choice(list(MY_USER_AGENT))
          print("user-agent:", agent)                     
    
          #将User-Agent附加到Reqeust对象的headers中
    
          request.headers.setdefault('User-Agent', agent)
    
    

    3.启用中间件UserAgentMiddleware。

    # Enable or disable downloader middlewares
    # See https://doc.scrapy.org/en/latest/topics/downloader-middleware.html
    DOWNLOADER_MIDDLEWARES = {
      'qidian_hot.middlewares.QidianHotDownloaderMiddleware': None,
      'qidian_hot.middlewares.QidianHotUserAgentMiddleware': 100,
    }
    

    • 使用HTTP代理服务器
      HTTP代理服务器功能就是代理网络用户取获取网络信息,它相当于客户端浏览器和网站服务器之间的信息中转站。
      在爬虫中采用大量的随机代理服务器访问某个网站,则该网站很难检测出爬虫。
      在这里插入图片描述

    参考文献

    盘点一些网站的反爬虫机质
    功能强大的python包(八):Scrapy (网络爬虫框架)

    展开全文
  • 1 反爬虫技术及突破措施 1.1 降低请求频率 降低请求频率以模仿人类用户,而不是机器。 settings.py中设置DOWNLOAD_DELAY即可 # 即两次请求间隔为 3 秒 DOWNLOAD_DELAY = 3 另外,为了防止请求过于规律,可以使用...
  • Python爬虫理论 | (5) 反反爬虫技术

    千次阅读 2019-07-06 15:17:39
    2.常见的反爬虫技术 3.Selenuim库 4.实战 1. 爬虫、反爬虫与反反爬虫 爬虫 自动获取网页信息的程序。 反爬虫 阻止爬虫程序获取网页信息的程序。 反反爬虫 应对反爬虫程序,爬取网页信息的程序。 其中,爬虫...

    目录

    1. 爬虫、反爬虫与反反爬虫

    2.常见的反爬虫技术

    3.Selenuim库

    4.实战

     

    1. 爬虫、反爬虫与反反爬虫

    • 爬虫

    自动获取网页信息的程序。

    • 反爬虫

    阻止爬虫程序获取网页信息的程序。

    • 反反爬虫

    应对反爬虫程序,爬取网页信息的程序。

    其中,爬虫和反反爬虫是用户的行为;反爬虫是服务器的行为。

    2.常见的反爬虫技术

    主要包括以下四种:

    1)Headers校验

    2)动态页面

    3)IP限制

    4)验证码

    • Headers校验

    HTTP的请求头(headers)是指每次向网络服务器发送请求时传递的一组属性和配置信息。

    HTTP定义了十多种请求头类型,但只有几个字段比较常用。对 HTTP 请求头的每个属性进行“是否具有人性”的检查,就是为了阻挡爬虫程序。

    请求头可以通过requests模块进行自定义。

    实例:

    下面程序可用于显示浏览器访问请求头信息。https://www.whatismy browser.com/ 可以获取本机配置信息。 

    import requests
    from bs4 import BeautifulSoup
    session = requests.Session()
    headers = {"User-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36",
               "Accept": "text/html, application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"}
    url = "https://www.whatismybrowser.com/developers/what-http-headers-is-my-browser-sending"
    req = session.get(url, headers=headers)
    bsObj = BeautifulSoup(req.text, features="lxml")
    print(bsObj.find("table", {"class": "table-striped"}).get_text)
    

     

    通常headers中最重要的参数之一是 User-Agent。无论做什么项目,一定要记得把 User-Agent 属性设置成不容易引起怀疑的内容,不要用Python-urllib/3.4之类的。(浏览器的User-Agent属性值,可以在Chrome浏览器中任意打开一个网页,右键点击检查,在Network选项卡中,任意打开一个请求,就可以得到这个属性值,以后在程序中使用时,直接copy。)

    另外,如果你正在处理一个警觉性非常高的网站,就要注意那些经常用却很少检查的请求头,比如 Accept-Language 属性,也许它正是那个网站判断你是否为人类访问者的关键。(Headers中的各种属性值,都可以在上图中找到。)

     

    1)User-Agent 

    User Agent,中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。

    在网络请求当中,User-Agent 是标明身份的一种标识。网站通过判断 UA 来给不同的操作系统、不同的浏览器发送不同的页面,因此可能造成某些页面无法在某个浏览器中正常显示,但通过伪装UA 可以绕过检测。

    UA反爬虫:是一种黑名单策略,只要出现在黑名单中的请求,都视为爬虫,对于此类请求将不予处理或返回错误提示。

    绕过 UA反爬虫:将爬虫程序中请求头的 User-Agent 的值改为浏览器的User-Agent ,这样就能够欺骗服务器,达到绕过反爬虫的目的。

    2)referer

    Referer是HTTP协议中的一个请求报头,用于告知服务器,用户的来源页面。如果从一个网页跳转到另一个网页,http 请求头里会带有Referer参数。

    Referer主要用于统计,像CNZZ、百度统计等可以通过Referer统计访问流量的来源和搜索的关键词(包含在URL中)等等,方便站长们有针性对的进行推广和SEO。另一个用处是防盗链。

    盗链:是指服务提供商自己不提供服务的内容,通过技术手段绕过其它有利益的最终用户界面(如广告),直接在自己的网站上向最终用户提供其它服务商的服务内容,骗取最终用户的浏览和点击率。受益者不提供资源或者提供很少的资源,而真正的服务提供商却得不到任何的利益。

     Referer防盗链:服务器通过检测 Referer 是否来自指定域名,从其他非服务提供者指定的HTTP请求得不到正常结果。主要用于图片、视频和网盘服务器。

    绕过referer防盗链:修改请求头中 Referer值。

    实例:

    下载天涯社区某页面的一张图片:http://bbs.tianya.cn/post-ehomephot-50239-1.shtml

    import requests
    url = 'http://img3.laibafile.cn/p/m/308757865.jpg' #图片的地址
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36',
               'Referer': 'http://bbs.tianya.cn/post-ehomephot-50239-1.shtml'} #Referer指明我们是来自天涯社区,如果不加的话 将无法爬取该图片
    response = requests.get(url, headers=headers)
    print(response.status_code)
    with open('referer_photo.jpg', 'wb') as f:
        f.write(response.content)
    

    完整代码:

    import requests
    from requests import RequestException
    
    
    def get_response(url):
    	try:
    		headers = {
    			'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36',
    			'Referer': 'http://bbs.tianya.cn/post-ehomephot-50239-1.shtml'
    		}
    		response = requests.get(url, headers=headers)
    		print(response.status_code)
    		if response.status_code == 200:
    			response.encoding = response.apparent_encoding
    			return response
    		return None
    	except RequestException:
    		print('RequestException')
    		return None
    
    url = 'http://img3.laibafile.cn/p/m/308757865.jpg'
    response = get_response(url)
    with open('1.jpg', 'wb') as f:
    	f.write(response.content)
    

    不在Headers中加Referer属性,将无法爬取该图片,结果如下:

     加了Referer属性后,表明我们是来自天涯社区,此时则可以爬取,结果如下:

    (3) cookies

    Cookies:指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据。简单来说Cookie就是一个浏览器上的缓存,前端工程师有时用它当数据库使。

    Cookies反爬虫:常见的Cookie反爬有两种,一种是在后端设置,通过Response的Header传输到前端浏览器中;另一种则通过前端调用document.cookie来设置。对于反爬效果来说,第二种比第一种效果好。

    绕过cookies反爬虫:第一种通过修改请求头中 cookie 值;第二种则通过动态页面技术。

    • IP限制

    IP限制:服务器会检测某个IP 在单位时间内的请求次数,如果超过了某个阈值,那么服务器会直接拒绝服务,返回错误信息。这种情况称为封IP。

    绕过IP 限制反爬虫:借助代理方式来伪装IP,让服务器无法识别由本机发起的请求,这样就可以成功防止封IP。

    • 动态页面

    有时在用requests抓取页面的时候,在浏览器中可以看到正常显示的页面数据,但是使用requests得到的结果并没有显示的内容。这是因为requests获取的都是原始的HTML文档,而浏览器中的页面则是经过JavaScript 处理数据后生成的结果。

    这些数据的来源有多种,可能是通过Ajax加载的,可能是包含在HTML文档中的,也可能是经过JavaScript和特定算法计算后生成的。

    Ajax:

    Ajax---Asynchronous JavaScript and XML,异步的JavaScript和XML。它不是一门编程语言,而是利用JavaScript在保证页面不被刷新、页面链接不改变的情况下与服务器交换数据并更新部分网页的技术。

    Ajax加载方式,可以直接分析Ajax请求,仍然借助requests或urllib来实现数据爬取。

    JavaScript:

    问题:部分页面由Javascript生成,并不包含Ajax请求;难以找出Ajax请求的规律。

    解决思路:模拟浏览器运行,抓取渲染之后的页面代码。

    Python实现:python提供了模拟浏览器运行的库,如Selenium、Splash等。

    • 验证码

    验证码(CAPTCHA),“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和人类的图灵测试),是一种区分用户是计算机还是人的公共全自动程序。可以防止:恶意破解密码、刷票、论坛灌水,有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试。常用于以下情况:

    •登录验证码

    •当某一用户访问次数过多后,就自动让请求跳转到一个验证码页面,只有在输入正确的验证码之后才能继续访问网站

    常见的验证码主要包括:图片验证码,滑动验证码,点触验证码,宫格验证码。

    3.Selenuim库

    Selenium是一个强大的网络数据采集工具,因为它们可以直接运行在浏览器上,最初是为网站自动化测试而开发的。近几年,它被广泛用于获取精确的网站快照。Selenium可以让浏览器自动加载页面,获取需要的数据,甚至页面截屏,或者判断网站上某些动作是否发生。利用它可以驱动浏览器执行特定的动作,如点击、下拉等操作,同时还可以获取浏览器当前页面的源代码,做到可见即可爬。

    Selenium 自己不带浏览器,它需要与第三方浏览器结合在一起使用。Selenium支持大部分浏览器,如Chrome、Firefox等,还有Android等手机端的浏览器,以及无界面浏览器PhantomJS。

    前提:

    需要安装Chrome浏览器,以及与Chrome浏览器版本相对应的ChromeDriver。具体细节可以自行百度,这里不再赘述。

    然后安装Selenium库:pip install selenium

    在程序中输入以下代码:

    from selenium import webdriver
    browser = webdriver.Chrome()
    

    如果弹出下面的界面,说明配置成功:

    • selenium库的基本操作

    1)访问页面

    2) 查找节点

    3) 获取节点信息

    4)节点交互

    5)动作链

    6)alert

    7)执行JavaScript

    8)cookies操作

    9)延时等待

    10)异常处理

    访问页面:

    from selenium import webdriver
    
    browser = webdriver.Chrome()
    browser.get('http://taobao.com') #访问淘宝
    print(browser.page_source)  #打印页面源码

     此时会弹出淘宝的首页,并且控制台打印出页面源码:

     查找节点:

    查找单个节点:

    find_element_by_name()
    find_element_by_id()
    find_element_by_css_selector()
    find_element_by_xpath()
    find_element()
    

    例如查找淘宝首页的搜索输入框:右键点击检查,查看网页源码,点击下图所示的按钮,并将鼠标移动到输入框上,就会自动的帮我们快速定位输入框对应的HTML代码的位置:

     

    input1 = browser.find_element_by_name('q') #根据name属性查找 属性值为q
    print(input1)
    input2 = browser.find_element_by_id('q') #根据id属性查找 属性值为q
    print(input2)
    input3 = browser.find_element_by_css_selector('.search-combobox-input') #根据css选择器查找 使用class属性
    print(input3)

     

    查找多个节点:

    find_elements()

    例如查找淘宝首页左侧的所有选项卡:

    发现每一行的选项都在li标签下,每个选项对应li标签下的一个a标签:

    #只需要找到所有的li标签下的所有的a标签即可
    list1 = browser.find_elements_by_xpath('//li[@class="J_Cat a-all"]/a') #多个节点要加s elements 使用xpath解析
    print(list1)

     获取节点信息:

    获取属性:

    WebElement.get_attribute()
    

    获取文本值:

    WebElement.text
    

     获取id、位置、标签名、大小:

    WebElement.id、WebElement.location、
    WebElement.tag_name、WebElement.size
    

    例如查看之前查找的所有节点的文本值和href属性值:

    for i in list1:
        print(i.text)
        print(i.get_attribute('href'))
        

    节点交互:

    输入文本:

    send_keys()

     清空文本:

    clear()

    点击按钮:

    click()

     前进:

    forward()

    后退:

    back()

     例如在之前查找的输入框内输入iphone,并点击搜索按钮进行搜索:

    input1.send_keys('iphone')
    button = browser.find_element_by_css_selector('.btn-search') #找到搜索按钮
    button.click()

    动作链:

    动作链---没有指定的执行对象,比如鼠标拖曳。

    from selenium.webdriver import ActionChains
    browser = webdriver.Chrome()
    browser.get('https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')
    browser.switch_to.frame('iframeResult')  # 切换Frame  进入子页面 
    source = browser.find_element_by_css_selector('#draggable')  #找到源位置
    target = browser.find_element_by_css_selector('#droppable') #找到目标位置
    actions = ActionChains(browser)
    actions.drag_and_drop(source, target)  #将源位置拖拽到目标位置
    actions.perform()  #执行
    

     

    alert:

    定位弹出对话框:

    switch_to.alert()

    获取对话框文本值:

    text

    相当于点击“确认”:

    accept()

     相当于点击“取消”:

    dismiss()

     完成上述操作后,可以关闭浏览器,不过有一个提示框,要先处理提示框,才能关闭浏览器:

    browser = webdriver.Chrome()
    browser.get('https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')
    browser.switch_to.frame('iframeResult')  # 切换Frame  进入子页面 
    source = browser.find_element_by_css_selector('#draggable')  #找到源位置
    target = browser.find_element_by_css_selector('#droppable') #找到目标位置
    actions = ActionChains(browser)
    actions.drag_and_drop(source, target)  #将源位置拖拽到目标位置
    actions.perform()  #执行
    
    alert = browser.switch_to.alert
    print(alert.text)
    alert.accept()
    browser.close()

    执行Javascript:

    对于某些操作,Selenium API没有提供,如下拉进度条,可以模拟运行JavaScript实现.

    execute_script()

    执行下拉进度条:

    browser = webdriver.Chrome()
    browser.get('https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')
    #执行下拉进度条
    browser.execute_script("window.scrollTo(0,document.body.scrollHeight)")

     选项卡管理:

    browser.execute_script('window.open()')
    print(browser.window_handles)
    browser.switch_to.window(browser.window_handles[1]) #打开一个新页面 
    browser.get('https://www.taobao.com') #访问淘宝
    browser.get('https://www.baidu.com') #访问百度
    browser.back() #返回淘宝
    browser.forward() #回到百度

    cookies操作:

    获取cookies:

    get_cookies()

    添加cookies:

    add_cookie()

     删除cookies:

    delete_all_cookies()

    cookies是一个字典,有很多键值对,下面是一些字段的含义: 

    browser = webdriver.Chrome()
    browser.get('https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')
    #获取页面cookies
    print(browser.get_cookies())
    #添加cookies
    browser.add_cookie({'name':'name','value':'value','domain':'.runoob.com'})
    print(browser.get_cookies())
    browser.delete_all_cookies()
    print(browser.get_cookies())

     延时等待:

    隐式等待:implicitly_wait()

    在创建driver时,为浏览器对象创建一个最长等待时间,这个方法是得不到某个元素就等待,直到拿到元素位置(如果一直拿不到就等到时间截止),再执行下一步。

    browser = webdriver.Chrome()
    browser.implicitly_wait(10) #隐式等待 10s
    browser.get('https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')
    #browser.switch_to.frame('iframeResult') 如果不切换frame  找不到draggable这个节点  会等待10s后 爆出异常
    draggable = browser.find_element_by_id('draggable')

    显式等待:WebDriverWait()

    明确的要等到某个元素的出现或者是某个元素的可点击等条件,等不到,就一直等,如果在规定的时间之内都没等到则跳出Exception。

    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.wait import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    browser = webdriver.Chrome()
    browser.implicitly_wait(10) #隐式等待 10s
    browser.get('https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')
    browser.switch_to.frame('iframeResult') #如果不切换frame  找不到draggable这个节点  会等待10s后 爆出异常
    
    #定义显式等待
    wait = WebDriverWait(browser, 10)
    draggable = wait.until(EC.presence_of_element_located((By.ID, 'draggable')))
    print(draggable)
    browser.close()

    显式等待条件:

     

    异常处理:

     

    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.wait import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.common.exceptions import NoSuchElementException,TimeoutException
    
    browser = webdriver.Chrome()
    browser.implicitly_wait(10) #隐式等待 10s
    try:
        browser.get('https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')
    except TimeoutException:
        print('time out')
    browser.switch_to.frame('iframeResult') #如果不切换frame  找不到draggable这个节点  会等待10s后 爆出异常
    
    #定义显式等待
    wait = WebDriverWait(browser, 10)
    try:
        draggable = wait.until(EC.presence_of_element_located((By.ID, 'draggable')))
        print(draggable)
    except NoSuchElementException:
        print("No")
    
    browser.close()

    4.实战

    • 爬取新浪新闻

    爬取新浪新闻中滚动页面的新闻内容,包括题目、时间、来源、正文,并存入MongoDB数据库。

    https://news.sina.com.cn/roll

    完整项目

    • 爬取人民网新闻

    爬取人民网新闻滚动新闻页面的新闻内容,包括题目、时间、来源、正文,并存入MongoDB数据库。

    http://news.people.com.cn/

    完整项目

     

    展开全文
  • 最全反爬虫技术介绍

    2020-12-06 14:36:23
    反爬虫技术大概分为四个种类:注:文末有福利!一、通过User-Agent来控制访问:无论是浏览器还是爬虫程序,在向服务器发起网络请求的时候,都会发过去一个头文件:headers,比如知乎的requestsheaders:Accept:text...

    反爬虫 的技术大概分为四个种类:

    注:文末有福利!

    一、通过User-Agent来控制访问:

    无论是浏览器还是爬虫程序,在向服务器发起网络请求的时候,都会发过去一个头文件:headers,比如知乎的requests headers:

    Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8

    Accept-Encoding:gzip, deflate, sdch, br

    Accept-Language:zh-CN,zh;q=0.8,en;q=0.6,zh-TW;q=0.4,da;q=0.2,la;q=0.2

    Cache-Control:max-age=0

    Connection:keep-alive

    Cookie: **********

    Host:http://zhuanlan.zhihu.com

    Referer:Ehco - 知乎

    Upgrade-Insecure-Requests:1

    User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36

    Query String Parameters

    view source

    view URL encoded

    这里面的大多的数的字段都是浏览

    这里面的大多数的字段都是浏览器向服务器”表明身份“用的

    对于爬虫程序来说,最需要注意的字段就是:User-Agent

    很多网站都会建立 user-agent白名单,只有属于正常范围的user-agent才能够正常访问。

    比如知乎:

    importrequests

    importbs4

    importrandom

    defget_html(url):

    try:

    r = requests.get(url, timeout=30)

    r.raise_for_status

    r.encoding =r.apparent_encoding

    returnr.text

    except:

    return "Someting Wrong!"

    print(get_html('https://zhuanlan.zhihu.com'))

    # OUT:

    '''

    500 Server Error

    An internal server error occured.

    '''

    可以看到,这里的请求被拒绝了,并且返回了一个500的错误码:

    这里就是因为requests库本身的headers是这样的:

    {'Date': 'Tue, 09 May 2017 12:13:00 GMT', 'Content-Type': 'text/html', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'Set-Cookie': 'aliyungf_tc=AQAAAPDDXQnf6AEAHaBXcP1tHo5z1uta; Path=/; HttpOnly, acw_tc=AQAAAAM

    89GeptQMAHaBXcJiyTK3l8c5g; Path=/; HttpOnly', 'Cache-Control': 'no-cache'}

    这里面并没有user-agent字段,自然不被知乎的服务器所接受了。

    解决方法:

    可以自己设置一下user-agent,或者更好的是,可以从一系列的user-agent里随机挑出一个符合标准的使用,代码如下:

    defget_agent():

    '''

    模拟header的user-agent字段,

    返回一个随机的user-agent字典类型的键值对

    '''agents = ['Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;',

    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv,2.0.1) Gecko/20100101 Firefox/4.0.1',

    'Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; en) Presto/2.8.131 Version/11.11',

    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11',

    'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)']

    fakeheader ={}

    fakeheader['User-agent'] =agents[random.randint(0, len(agents))]

    returnfakeheader

    # 注意看新的请求函数:

    defget_html(url):

    try:

    r = requests.get(url, timeout=30,headers=get_agent())

    r.raise_for_status

    r.encoding =r.apparent_encoding

    returnr.status_code

    except:

    return "Someting Wrong!"

    '''

    OUT:

    200

    '''

    二、通过IP限制来反爬虫:

    如果一个固定的ip在短暂的时间内,快速大量的访问一个网站,那自然会引起注意,管理员可以通过一些手段把这个ip给封了,爬虫程序自然也就做不了什么了。

    解决方法:

    比较成熟的方式是:IP代理池

    简单的说,就是通过ip代理,从不同的ip进行访问,这样就不会被封掉ip了。

    可是ip代理的获取本身就是一个很麻烦的事情,网上有免费和付费的,但是质量都层次不齐。如果是企业里需要的话,可以通过自己购买集群云服务来自建代理池。

    这里实现了一个简单的代理转换,代码如下:

    defget_proxy():

    '''

    简答模拟代理池

    返回一个字典类型的键值对,

    '''proxy = ["http://116.211.143.11:80",

    "http://183.1.86.235:8118",

    "http://183.32.88.244:808",

    "http://121.40.42.35:9999",

    "http://222.94.148.210:808"]

    fakepxs ={}

    fakepxs['http'] =proxy[random.randint(0, len(proxy))]

    return fakepxs

    三、通过JS脚本来防止爬虫:

    这个可以说是终极的办法了,因为,爬虫终归只是一段程序,它并不能像人一样去应对各种变化,如验证码,滑动解锁之类的。

    举个例子:如果想爬取某个网站,但是在进入网站之前,它会有一个验证页面来验证你是不是机器。

    它是怎么验证的呢:

    他会通过js代码生成一大段随机的数字,然后要求浏览器通过js的运算得出这一串数字的和,再返回给服务器.

    可想而知,这么简单和最基础的一个验证步骤,会是写的代码完成不了的。

    解决方法:

    这里就要请出一个大杀器:”PhantomJS“

    PhantomJS是一个Python包,他可以在没有图形界面的情况下,完全模拟一个”浏览器“,js脚本验证什么的再也不是问题了。

    四、通过robots.txt来限制爬虫:

    世界上做爬虫最大最好的就是Google了,搜索引擎本身就是一个超级大的爬虫,Google开发出来爬虫24h不间断的在网上爬取着新的信息,并返回给数据库,但是这些搜索引擎的爬虫都遵守着一个协议:robots.txt

    robots.txt(统一小写)是一种存放于网站根目录下的ASCII编码的文本文件,它通常告诉网络搜索引擎的漫游器(又称网络蜘蛛),此网站中的哪些内容是不应被搜索引擎的漫游器获取的,哪些是可以被漫游器获取的。因为一些系统中的URL是大小写敏感的,所以robots.txt的文件名应统一为小写。robots.txt应放置于网站的根目录下。如果想单独定义搜索引擎的漫游器访问子目录时的行为,那么可以将自定的设置合并到根目录下的robots.txt,或者使用robots元数据(Metadata,又称元数据)。

    robots.txt协议并不是一个规范,而只是约定俗成的,所以并不能保证网站的隐私。注意robots.txt是用字符串比较来确定是否获取URL,所以目录末尾有与没有斜杠“/”表示的是不同的URL。robots.txt允许使用类似"Disallow: *.gif"这样的通配符[1][2]。

    wiki上说的已经很清楚了,这实际上只是一个”君子协议“,遵守与否,都在于爬虫的编写者。

    来看一下京东的'robots.txt':

    User-agent: *Disallow: /?*Disallow: /pop/*.html

    Disallow: /pinpai/*.html?*User-agent: EtaoSpider

    Disallow: /User-agent: HuihuiSpider

    Disallow: /User-agent: GwdangSpider

    Disallow: /User-agent: WochachaSpider

    Disallow: /

    可以看到,京东的robots协议里明确的指出四个”user-agent”是禁止访问的,

    事实上,这四个user-agent也是四个臭名昭著的恶性爬虫。

    所以最好遵守这个规则!,互联网上的很多资源都是免费的,但是如果因为个人的利益,而损害到别人,这是很不对的!

    当然有种情况是例外的,比如说我们爬虫的获取网页的速度,和人类浏览网页是差不多的,这并不会给服务器造成太大的性能损失,在这种情况下,我们是可以不用恪守 robots协议的。

    最后,给大家推荐一个良心公众号【IT资源社】:

    本公众号致力于免费分享全网最优秀的视频资源,学习资料,面试经验等,前端,PHP,JAVA,算法,Python,大数据等等,你想要的这都有

    IT资源社-QQ交流群:601357554

    微信搜索公众号:ITziyuanshe 或者扫描下方二维码直接关注,

    里面基本什么资料都有,基础到进阶到项目实战,如果觉得不够还可以加群跟群主要,最重要的是全部免费!

    展开全文
  • 爬虫与反爬虫技术分析

    千次阅读 2020-02-27 11:28:15
    科普: 什么是爬虫: 百度百科:网络爬虫(又被称为...什么是反爬虫: 百度百科:很多网站开始保护他们的数据,他们根据ip访问频率,浏览网页速度,账户登录,输入验证码,flash封装,ajax混淆,js加密,图片,cs...
  • 反爬虫技术实践案例

    2019-04-17 16:13:42
    笔者第一份工作就是以java工程师的名义写爬虫,不得不说第一份工作很重要啊,现在除了爬虫不会干别的,到现在已经干了近5年了,期间经历了不少与反爬策略的斗争。最近又耗时两周成功搞定了某网站的反爬策略后,心里...
  • 搜索引擎可以通过爬虫抓取网页信息,同时也有很多企业通过爬虫获取其他平台的信息用于数据分析或者内容优化,但是对于自身网站有些页面或者信息并不希望被爬虫抓取,那我们如何来实现反爬虫技术呢?如何防止别人爬...
  • 黑马程序员视频库播妞QQ号:3077485083传智播客旗下互联网资讯、学习资源免费分享平台你被爬虫侵扰过吗?爬虫不仅会占用大量的网站流量,造成有真正需求的用户无法进入网站,同时也可能会...
  • 不同类型的网站都有不一样的反爬虫机制,判断一个网站是否有反爬虫机制需要根据网站设计架构、数据传输方式和请求方式等各个方面评估。下面是常用的反爬虫机制。 用户请求的Headers。 用户操作网站行为。 网站目录...
  • 今天小编就为大家分享一篇关于Python反爬虫技术之防止IP地址被封杀的讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
  •  网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本,它们被广泛用于互联网搜索引擎或其他类似网站, 可以自动采集...
  • 常见的反爬虫技术

    千次阅读 2018-07-26 18:51:18
    爬虫和反爬的对抗一直在进行着…为了帮助更好的进行爬虫行为以及反爬,今天就来介绍一下网页开发者常用的反爬手段。 通过robots.txt来限制爬虫爬虫都遵守着一个协议:robots.txt robots.txt(统一小写)是一种...
  • 最全的反爬虫技术

    千次阅读 2018-06-21 16:11:21
    反爬虫 的技术大概分为四个种类: 注:文末有福利!一、通过User-Agent来控制访问:无论是浏览器还是爬虫程序,在向服务器发起网络请求的时候,都会发过去一个头文件:headers,比如知乎的requests headers:...
  • 比如你一个做在线教育的平台,题目的数据很重要吧,但是被别人通过爬虫技术全部爬走了?如果核心竞争力都被拿走了,那就是凉凉。再比说有个独立开发者想抄袭你的产品,通过抓包和爬虫手段将你核心的数据拿走,然后...
  • python爬虫之反爬虫技术

    千次阅读 2018-03-15 13:54:14
    一般网站从三个方面反爬虫:1.用户请求的Headers,2.用户行为,3.网站目录和数据加载方式。前两种比较容易遇到,大多数网站都从这些角度来反爬虫。第三种一些应用ajax的网站会采用,这样增大了爬取的难度(防止静态...
  • 这些集中在表单和登录环节上的机器人安全措施,对网络爬虫来说确实是严重的挑战。 4. 注意隐含输入字段值 在 HTML 表单中,“隐含”字段可以让字段的值对浏览器可见,但是对用户不可见(除非看网页源代码)。...
  • 大数据时代的反爬虫技术_陈利婷 大数据时代的反爬虫技术_陈利婷
  • 基于Python的反反爬虫技术分析与应用
  • 基于Python的反反爬虫技术分析与应用.pdf
  • 基于Python的网络爬虫与反爬虫技术研究
  • 爬虫的本质就是“抓取”第二方网站中有价值的数据,因此,每个网站都会或多或少地采用一些反爬虫技术来防范爬虫。比如前面介绍的通过 User-Agent 请求头验证是否为浏览器、使用JavaScript动态加载资源等,这些都是...
  • 基于Python的网络爬虫与反爬虫技术的研究
  • 网站会用 cookie 跟踪你的访问过程,如果发现了爬虫异常行为就会中断你的访问,比如特别快速地填写表单,或者浏览大量页面。虽然这些行为可以通过关闭并重新连接或者改变 IP 地址来伪装,但是如果 cookie 暴露了你的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 16,683
精华内容 6,673
关键字:

反爬虫技术

爬虫 订阅
友情链接: 919002.rar