精华内容
下载资源
问答
  • 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/

    完整项目

     

    展开全文
  • 本文针对目前各种爬虫框架, 包括scrapy, requests, selenium 等, 整理和总结了一些针对其特征进行反爬虫的方法 。 一、反爬虫是什么? 在这个内容为王的时代, 窃取内容, 成了很多商业模式的致富之道, 为了更...


    前言

    本文针对目前各种爬虫框架, 包括scrapy, requests, selenium 等, 整理和总结了一些针对其特征进行反爬虫的方法 。


    一、反爬虫是什么?

    在这个内容为王的时代, 窃取内容, 成了很多商业模式的致富之道, 为了更好的保护网站上的内容不被窃取, 只能是针对爬虫的技术进行分析研究, 然后针对其特点进行针对性防护。反爬虫就是防止网站内容被大规模窃取的一种解决方案。 本文的内容大部分来自网络整理, 希望能给一些站长提供一些思路。

    二、爬虫的几种实现方案

    1.网络请求

    使用自己构建网络请求, 利用http协议直接从网站获取网页内容信息, 包括requests, scrapy等都采用直接http请求的方式进行数据抓取。 这种方式的有点是速度快, 缺点是, 有些网站通过js的方式进行页面内容填充, 就会导致request请求回来的数据里面不包含关键的内容信息, 如果进一步通过数据包分析有一些网站可以解析出请求关键信息的网络包, 进行模拟, 但是有一些网站对数据进行加密, js代码混淆后, 就彻底没有办法了。

    2.模拟浏览器执行

    采用浏览器模拟执行, 是另外一个非常好的方式, 因为他完全可以无视网络加密和js混淆, 所见即所得, 利用这种方式, 只要你在浏览器上显示出来, 我就能抓取到。 就算你在变态, 把网络内容全都生成图片, selenium也可以直接进行屏幕截图。 但是他有一个很大的缺点就是效率极低。

    各种爬虫工具的优缺点分析

    1. requests
      优点: 抓取速度快, 可以模拟session登录,
      缺点: 不能模拟浏览器执行js
    2. scrapy
      优点: 效率极高, 一整就给网站干死。
      缺点:效率太高。无法模拟session登录。
    3. selenum
      优点: 模拟浏览器执行,
      缺点:效率太低

    其实针对不同的网站, 在进行实际抓取的时候, 都得单独进行分析, 有些网站对爬虫比较友好, 不会去检测访问的频率和ip并且服务器性能也特别好, 遇到这种的服务器, 你就谢谢人家吧。 有的网站会有一些反爬虫的策略, 要么是js混淆, 数据动态加载。 要么就是针对访问频率进行封ip的操作。 当然爬虫也可以通过代理进行访问, 但是代理是要钱的啊。 这就得看你这网站的数据有多大价值了。 所以爬虫最后的关键点就是落在了效率上。
    一下是针对反爬虫策略整理的一下方案,仅供品尝。

    3.反爬虫方案

    1. ip访问检测
    2. js混淆
    3. 前端数据动态加载
    4. 针对selenium添加检测js

    目前针对以上爬虫的开发方案, 总结出以上4中反爬虫策略, 具体实现方案, 就不一一整理了, 针对不同的项目, 比如js混淆和动态加载都得具体问题具体分析。 针对selenium, 可以在js中添加代码来进行检测。

    webdriver = window.navigator.webdriver;
    if(webdriver){
        console.log('你以为使用Selenium模拟浏览器就没事了?')
    } else {
        console.log('正常浏览器')
    }
    

    最终的最终

    如果网站采用了js动态加载, 混淆, 以及ip限制策略, 并且也限制了检测了selenium, 而且就算不在selenium上做文章,继续深入研究怎么能让selenium不让js检测到。 我最终也可以自己写个浏览器来仿照selenium进行抓取, 所以其实无论如何, 还是都可以抓取到网页的内容的, 只是效率会低一些。 至于往下一步, 如果能测试杜绝爬虫, 是否还有更好的方式, 还需要进一步深入的研究。 希望有这方面经验的朋友能指点一二。

    展开全文
  • 反爬虫的概念与定义

    2020-03-25 17:31:06
    主动型反爬虫和被动型反爬虫 限制爬虫程序访问服务器资源和获取数据的行为称为爬虫。限制手段包括但不限于请求限制、拒绝响应、客户端身份验证、文本混淆和使用动态渲染技术。这些限制根据出发点可以分为...

    爬虫流量是“垃圾流量”

         爬虫程序的访问速率和目的与正常用户的访问速率和目的是不同的,大部分爬虫会无节制地对目标应用进行爬取,这给目标应用的服务器带来巨大的压力。爬虫程序发出的网络请求被运营者成为“垃圾流量”。
    在这里插入图片描述

    主动型反爬虫和被动型反爬虫

         限制爬虫程序访问服务器资源和获取数据的行为称为爬虫。限制手段包括但不限于请求限制、拒绝响应、客户端身份验证、文本混淆和使用动态渲染技术。这些限制根据出发点可以分为主动型反爬虫和被动型反爬虫。
    在这里插入图片描述

    主动型反爬虫

         开发者有意识地使用技术手段区分正常用户和爬虫,并限制爬虫对网站的访问行为,如验证请求头信息、限制访问频率、使用验证码等。

    被动型反爬虫

         为了提高用户体验或节约资源,用一些技术间接提高爬虫访问的行为,比如数据分段加载、点击切换标签页、鼠标悬停预览数据等。

    多类型爬虫

         除此之外,还可以从特点上对反爬虫进行更细致的划分,如信息校验型反爬虫、动态渲染型反爬虫、文本混淆型反爬虫、特征识别型反爬虫等。需要注意的是,用一种限制现象可以被归类到不同的反爬虫类型中,比如通过JavaScript生成随机字符串并将字符串放在请求头中发送给服务器,由服务器校验客户端身份的这种限制手段即可以说是信息校验型反爬虫,又可以说是动态渲染反爬虫。

    关注不迷路哦

    在这里插入图片描述

    展开全文
  • 你好,我是悦创。 本系列教程开始之前呢,我要先跟你探讨一下:...限制手段包括但不限于:请求限制、拒绝响应、客户端身份验证、文本混淆和使用动态渲染技术。 这些限制根据出发点可以分为:主动型反爬虫和被动型反爬

    你好,我是悦创。

    本系列教程开始之前呢,我要先跟你探讨一下:反爬虫是什么

    首先,反爬虫这件事在目前来讲,并没有明确的定义。(整个业内都没有一个明确的定义)那由于各方角色不同,或者用的编程语言或者工具不同,所以对于反爬虫的看法也各持己见。

    那么,在咱们这个系列课程中呢,我需要大家保持一个相同的观点:

    我们约定,限制爬虫程序访问服务器资源和获取数据行为的称为 反爬虫。

    限制手段包括但不限于:请求限制、拒绝响应、客户端身份验证、文本混淆和使用动态渲染技术。

    这些限制根据出发点可以分为:主动型反爬虫和被动型反爬虫。

    Ps:

    主动型反爬虫指的是,有意而为之,特意为我们(爬虫工程师)准备的一些限制手段。

    例如说:IP 限制、Cookies 校验、登录页面的验证码或者是注册页面的验证码等等

    被动型反爬虫指的是,当用户操作某样功能引起是的一个功能机制。

    例如说:下拉加载、悬停(预览)、以及一些网页数据的计算等等,这些是以提升用户体验为主要目的,但是它们也造成了——爬虫对这些数据的获取的一个限制效果。

    这节课主要分为 4 个知识点。

    目录

    1. (反爬虫)Web 网页的基本构成
    2. 浏览器的组件和作用
    3. HTML DOM与网页渲染过程
    4. 编程语言或工具与浏览器的差异
    1. Web 网页的基本构成

    这是浏览器打开网页后的一个截图,从截图当中我们可以看到有:导航栏、logo、搜索框、备案号相关信息等等,那么组成这个页面的主要元素就是 文字和图片 。当然,页面的元素远远不止这些,像优酷、网易或者爱奇艺、搜狗等等,网站当中还有音频和视频。

    接下来我们一起来看一下一个网页的基本构成

    (图片来源-网络)

    从左到右分别是:HTML、JavaScript、CSS、媒体资源、Other(和其他的一些东西)

    • HTML:HTML 是超文本标记语言,在文档当中它被 html 标签对包裹的文本(<html>-</html>)就是 HTML 文档或者是 HTML 的代码。
    • JavaScript:JavaScript 是一种解释型语言,在文档当中被 script 标签对(),包裹的文本就是 JavaScript 的代码。
    • CSS:CSS是层叠样式表,在文档中被 style 标签包裹着的就是 CSS 样式的代码

    那么之后的:图片视频音频和字体,这些都属于媒体或者多媒体资源。(例如:表示图片的标签通常是 img 标签,然后其中的 src 指向的就是 具体资源路径

    操作:打开浏览器观察资源加载

    按以下步骤来:

    1. 打开浏览器
    2. 访问:https://www.baidu.com/
    3. 打开浏览器的开发者工具(F12)
    4. 切换到 NetWork 面板

    1. 接下来刷新一些网页或者输入:Python 搜索

    现在,我们来看看到底加载哪些内容。

    这时候我们会发现,当我们访问百度这个网站的时候,加载的资源有:文档、css文件、图片(png、jpg)、js等

    2. 浏览器的组件和作用

    我们常用的浏览器共有五个组件和三个解释器,这五个组件分别是:用户界面、浏览器引擎、渲染引擎、数据存储、网络,三个解释器分别是:HTML 解释器、JavaScript 解释器、CSS 解释器

    那么浏览器之所以能够理解 HTML、CSS、JavaScript 代码,并且按照一定的规则排版,就是这个三个解释器的功劳。

    组件这边,用户界面组件的主要作用是显示操作界面,浏览器引擎的主要作用就是:负责将用户的操作传递给对应的渲染引擎,渲染引擎的主要作用是调用,**这三个解释器去解释对应的文档中的代码。然后根据解释器的结果重新排版页面。**数据存储组件它的作用是:**在本地存储一些体积较小的数据,如 Cookies、Storage对象等。**网络组件:它会自动加载 HTML 文档中所需要的其他资源。

    刚才带大家了解了浏览器的五大组件和三大解释器,我们可以在脑海中填补浏览器的结构图。 也就是说平常使用的浏览器,实际上是由一堆组件构成的一个工具。

    那么其中各个组件各司其职,例如:渲染组件、渲染引擎 它会调用三个解释器去解释并理解代码当中的一些意图。

    3. HTML DOM 与网页渲染过程

    HTML DOM 是文档对象模型,它是中立于平台和语言之间的一个接口。它允许程序动态的更新文档内容,文档结构和样式。换一句话来说:程序可以通过 DOM 来改变页面显示的内容,HTML 文档中的每一个标签对,都是一个 DOM 节点(例如:title 标签,对应一个 DOM节点,那么 year 标签对应的也是一个 DOM 节点)看一下上面右边的那张图,我们平时看到的一层一层、层层嵌套的 HTML 标签,实际上就是一个父子关系的一个 DOM 节点。JavaScript 代码和 CSS 样式,可以改变页面当中文字或图片的位置、颜色或者内容,但要注意的是:它们改变的只是页面显示的内容,并不是能够真正的去改变 HTML 文档本身。它们只是改变了浏览器中的 DOM,这个观点非常重要。(大家一定要理解)

    操作:打开浏览器编辑 HTML

    这里我们打开浏览器来做一个小实验,这里我们借助 W3school 的在线编辑器来运行 HTML 代码。

    <html>
    
    <!-- <style>
    .last{
    	color:red;
    }
    </style>
     -->
    <body>
    	<p id="first">这是段落。</p>
    	<p>这是段落。</p>
    	<p>这是段落。</p>
    	<p class="last">段落元素由 p 标签定义</p>
    </body>
    <!--
    <script>
    	first = document.getElementById("first");
    	first.innerHTML = "我说这是什么就是什么";
    </script>
    -->
    </html>
    

    我们可以看一下上面的代码,这些代码都包裹在 html 标签对当中。那么 body 标签当中包裹着的就是 HTML 的代码,<style></style> 标签对包裹着的是 CSS 样式<script></script> 标签对包裹的是 JavaScript 代码 在 HTML 中这个是注释符:<!----> 被注释符注释掉的,不会在代码中起作用。

    我们先运行以下代码:

    <html>
    <body>
    <p id="first">这是段落。</p>
    <p>这是段落。</p>
    <p>这是段落。</p>
    <p class="last">段落元素由 p 标签定义</p>
    </body>
    
    </html>
    

    我们来看看运行结果:

    我们可以看到,右侧的内容显示区域,显示了 HTML 文档当中定义的内容。

    我接下来来运行以下代码:

    <html>
    <style>
    .last{
    	color:red;
    }
    </style>
    
    <body>
    	<p id="first">这是段落。</p>
    	<p>这是段落。</p>
    	<p>这是段落。</p>
    	<p class="last">段落元素由 p 标签定义</p>
    </body>
    </html>
    

    我们这时候可以看到最后的那一段文字的颜色,已经被改变了。

    同样我们加上 JavaScript 代码看看:

    <html>
    
    <style>
    .last{
    	color:red;
    }
    </style>
    
    <body>
    	<p id="first">这是段落。</p>
    	<p>这是段落。</p>
    	<p>这是段落。</p>
    	<p class="last">段落元素由 p 标签定义</p>
    </body>
    
    <script>
    	first = document.getElementById("first");
    	first.innerHTML = "我说这是什么就是什么";
    </script>
    
    </html>
    

    我们发现右侧内容区域的第一行内容已经被改变,那么问题来了:为什么内容区域的文字和颜色都发生了变化,但代码中的 body 标签包裹着的这些文字或者这些文本,都没有发生任何的变化呢?

    左侧的代码仍然是:**这是段落。**而显示给我们看的就是:我说这是什么就是什么。这时候想一下,思考一下:为什么会是这个样子的呢?

    其实,这正是之前所说的:它们其实就是 JavaScript 于 CSS 的改变的,也就是说浏览器当中的 DOM 节点是由 CSS 和 JavaScript 的改变,最终改变的不是 HTML 代码,或者它的文档中的内容,改变的其实是浏览器中 DOM 排版,要注意的是:这个变化是发生在 浏览器的显示层面 实际上 HTML 的根本没有发生任何的变化。

    上面我说到了页面的渲染过程,能够说明刚才我们做的实验得到的结果。

    上图的步骤可以让你更加的清晰。

    从开始,用户输入了一个网址(这是在用户界面组件当中进行的一个操作),那么当用户回车之后便进入了浏览器引擎的工作流程当中,接着就会根据 HTML 文档当中的内容去加载对应的资源(例如:图片、视频、音频、文字等等),这时候其实渲染引擎和三大解释器已经开始工作了,要不然浏览器也不知道到底需要去加载什么样的资源,那么资源的加载和代码的解释是同步进行的。最后渲染引擎按照三大解释器的解释结果来操作 DOM,也就是重新把页面内容进行排版,把排版得到的结果呈现给用户(也就是我们看到的网页内容)以上就是浏览器的一个工作流程。

    4. 编程语言或工具与浏览器的差异

    操作:用浏览器打开指定网址

    这里我们需要打开浏览器,然后访问一个网站(例如:GitChat

    可以看到浏览器访问之后可以,我们得到的是一个错落有致,排版精美的一个页面。那么我们试一试用代码或者用工具来请求一下同样的网址,看看会得到什么样的结果,打开 IDE 也就是 Pycharm。

    这里我们使用 requests 库GitChat发出网络请求。并且打印请求得到的内容。

    # !/usr/bin/python3
    # -*- coding: utf-8 -*-
    # @Author:AI悦创 @DateTime :2020/1/12 13:53 @Function :功能  Development_tool :PyCharm
    # code is far away from bugs with the god animal protecting
    #    I love animals. They taste delicious.
    import requests
    
    url = 'https://gitbook.cn/'
    
    html = requests.get(url).text
    print(html)
    
    # -------------输出-------------
    "C:\Program Files\Python37\python.exe" "D:/daima/pycharm_daima/JavaScript 逆向课程/01-探寻 JavaScript 反爬虫的根本原因/test_1.py"
    <!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, user-scalable=no"><title>GitChat</title><meta name="description" content="GitChat 是一款基于微信平台的知识分享产品。通过这款产品我们希望改变IT知识的学习方式。"><meta name="robots" content="index,follow"><meta name="keywords" content="GitChat,机器学习,大数据,程序员,用户体验,软件开发,知识付费,技术分享"><meta name="baidu-site-verification" content="BRkuL6TTfM"><link href="/dist/site/gitbook/bundle1.css" rel="stylesheet"><script src="/dist/site/gitbook/js1.js"></script><script src="/dist/js/jquery.lazyload.min.js"></script><link href="/css/gitbook/common/common.css" rel="stylesheet"><script src="/dist/gitbook/js/common.js"></script><link rel="icon" type="image/png" href="https://images.gitbook.cn/FrfR1mB39xM-U6iSAmDCpxWVxvoa" sizes="16x16"><link rel="icon" type="image/png" href="https://images.gitbook.cn/FrfR1mB39xM-U6iSAmDCpxWVxvoa" sizes="32x32"></head><link href="/dist/site/gitchat/bundle2.css" rel="stylesheet"><link rel="stylesheet" href="/dist/gitchat/css/mazi.css"><link rel="stylesheet" href="/dist/css/bootstrap.min.css"><link rel="stylesheet" href="/dist/gitbook/css/indexGitChat.css"><script src="/dist/js/ScrollMagic.min.js"></script><body><link rel="stylesheet" href="/dist/gitbook/css/mMaziJade.css"><div class="container_view"><link rel="stylesheet" href="/css/gitbook/topV6.css"><link rel="stylesheet" href="/dist/gitbook/css/topV6.css"><div id="header" class="headroom hidden-md hidden-lg hidden-sm top_box"><div style="float: left;-webkit-animation-name:none;animation-name:none;" class="container hidden-md hidden-lg hidden-sm"><ul id="gn-menu" class="gn-menu-main"><li class="gn-trigger"><a class="gn-icon gn-icon-menu"><span>Menu</span></a><nav class="gn-menu-wrapper"><div class="gn-scroller"><ul style="border-bottom:0" class="gn-menu"><li><a href="/" class="icon lnr-home">首 页</a></li><li><a href="/gitchat/columns" class="icon lnr-rocket">专 栏</a></li><li><a href="/gitchat/series/list" class="icon lnr-diamond">专 题</a></li><li><a href="/gitchat/geekbooks" class="icon lnr-book">电子书</a></li><li><a href="/books/5b398139328f856827673b50/index.html" class="icon lnr-earth">关于我们</a></li><li><a class="icon lnr-text-align-justify">活动分类</a><div class="activity_type clearfix"><a href="/gitchat/categories/58e84f875295227534aad506/1">前端</a><a href="/gitchat/categories/58e84f53ec8e9e7b34457809/2">人工智能</a><a href="/gitchat/categories/58e84f6bad952d6b3428af9a/3">架构</a><a href="/gitchat/categories/5953698a3d38293ecceacb89/4">区块链</a><a href="/gitchat/categories/58e84f1584c651693437f27c/5">职场</a><a href="/gitchat/categories/59c491948fee063dc3c447ab/6">编程语言</a><a href="/gitchat/categories/58e84f31ad952d6b3428af99/7">技术管理</a><a href="/gitchat/categories/58e84f7bec8e9e7b3445780d/8">大数据</a><a href="/gitchat/categories/591171a3e692d5280d8157b6/9">移动开发</a><a href="/gitchat/categories/58e84f2284c651693437f27d/10">产品与运营</a><a href="/gitchat/categories/58e84f425295227534aad502/11">测试</a><a href="/gitchat/categories/591f073981be962a981acf18/12">安全</a><a href="/gitchat/categories/5901bd477b61a76bc4016423/13">运维</a></div><div style="margin:0 auto;width:90%;margin-top: 180px;"></div></li></ul></div></nav></li>>严选</span></div><div class="chat_list"><a href="/gitchat/activity/5e17e817c01d3c1ce1be3e2f" target="_blank" class="chat_item">
    内容太多省略!
    内容太多省略!
    内容太多省略!
    内容太多省略!
    内容太多省略!
    内容太多省略!
    内容太多省略!
    内容太多省略!
    
    })
    function changeHomeColumn(num) {
        $('#syncColumn').addClass("syncColumn");
        $.ajax({
            url: "/gitchat/homepage/change/column/" + num,
            type: "GET",
            contentType: "application/json; charset=utf-8",
            success: function (data, status) {
                if (status == 'success' && data.code == 0) {
                    $('#homeColumns').html('');
                    $('#homeColumns').append(data.data);
                    $('#changeColumns').attr('onclick', 'changeHomeColumn(' + data.next + '); return false;')
                    $('#syncColumn').removeClass("syncColumn");
                }
            }
        });
    }</script></html>
    
    Process finished with exit code 0
    
    

    我们得到的就是 HTML 代码,没有经过渲染。

    接下来我们借助工具来操作一下,工具:PostMan

    这样在下面就会得到我们的响应正文,可以看到和 Python 代码的结果是完全一样的,并没有排版过,也没有请求到任何图片之类的资源。所以,我们请求得到的只是 HTML代码。实际上就是 GitChat的源代码,我们可以在谷歌浏览器访问网页之后,右键选择显示网页源代码看到得到的页面也是和我们前面得到的代码时一样的。

    刚刚我们用了几种不同的方式来访问了我们的 GitChat我们用一张图来解析:

    由图可知,我们浏览器可以得到其他所需要的内容,而工具得到的只是 HTML。

    这其实也就是:浏览器与其他工具的差异。准确来说,是因为其他工具当中没有 JavaScript 解释器,这里要注意 CSS 和 JavaScript 的情况时一样的也就是说可以利用其他工具当中没有 CSS 解释器和渲染引擎的特点来实现反爬虫。实际工作中由非常多这样的应用,例如我们常常听到的字体反爬虫、文本偏移反爬虫和文本混淆反爬虫手段等等。

    展开全文
  • 一、主题式网络爬虫设计方案 ...3.主题式网络爬虫设计方案概述(包括实现思路与技术难点) 实现思路:使用单线程爬取,初始化信息,设置请求头部信息,获取网页资源,使用etree进行网页解析,爬取多...
  • 详细讲解了 Python 网络爬虫实现的核心技术,包括网络爬虫的工作原理、如何用 urllib 库编写网络爬虫、爬虫的异常处理、正则表达式、爬虫中 Cookie 的使用、爬虫的浏览器伪装技术、定向爬取技术、反爬虫技术,以及...
  • 本资源是《Python网络爬虫技术》配套资源【完整版】,包含源数据和代码。 本书以任务为导向,较为全面地介绍了不同场景下Python爬取网络数据的方法,包括静态网页、动态网页、登录后才能访问的网页、PC客户端、APP等...
  • 技术维度:详细讲解了Python网络爬虫实现的核心技术,包括网络爬虫的工作原理、如何用urllib库编写网络爬虫、爬虫的异常处理、正则表达式、爬虫中Cookie的使用、爬虫的浏览器伪装技术、定向爬取技术、反爬虫技术,...
  • 150讲轻松搞定Python网络爬虫

    万人学习 2019-05-16 15:30:54
    另外在爬虫过程中,经常容易遇到被反爬虫,比如字体反爬、IP识别、验证码等,如何层层攻克难点拿到想要的数据,这门课程,你都能学到!        2、如果是作为一个其他行业的开发者,比如app开发...
  • 麓上学教育Python爬虫技术授课质量怎么样?...其次就是关于课程内容部分,爬虫方面的内容基本上都已经有讲到包括爬虫基础、框架、分布式爬虫以及反爬虫js解密,唯一有遗憾的地方就是关于移动端爬虫的内容基...
  • 爬虫------动态HTML处理

    2019-05-16 20:46:28
    一、常见的反爬虫技术 如果你在一个网站上看到了 jQuery,那么采集这个网站数据的时候要格外小心。...一些网站采取的反爬虫技术,一般包括ajax,DHTML等 1、什么是ajax? 我们与网站服务器通信...
  • C++网络爬虫项目

    2018-07-04 00:59:17
    除了上述功能模块,搜索引擎的“作弊”模块近年来越来越受到重视。搜索 引擎作为互联网用户上网的入口,对于网络流量的引导和分流至关重要,甚至 可以说起着决定性的作用。因此,各种“作弊”方式也逐渐流行起来,...
  • 本文源于我近期的一次公司内部分享...逆向在很多领域都有应用,比如如今爬虫技术已经遍地走,甚至不用写代码都可以爬取数据,导致前端开发的反爬意识也逐步提升。因此 JS、Android 等领域的逆向,已经成为爬虫开发者...
  • 本文源于我近期的一次...逆向在很多领域都有应用,比如如今爬虫技术已经遍地走,甚至不用写代码都可以爬取数据,导致前端开发的反爬意识也逐步提升。因此 JS、Android 等领域的逆向,已经成为爬虫开发者必备的技能...
  • 拉勾网的反爬虫做的很好,导致我们使用requests库进行爬取的时候,经常会被发爬虫,包括或返回空数据。同时,这个网站采用Ajax技术进行异步加载,我们在请求列表网页时,并不会获取到职位列表的相关信息,因此,使用...
  • 这就是搜索引擎-核心技术详解

    热门讨论 2013-02-02 23:24:31
    对于实际搜索引擎所涉及的各种核心技术都有全面细致的介绍,除了作为搜索系统核心的网络爬虫、索引系统、排序系统、链接分析及用户分析外,还包括网页作弊、缓存管理、网页去重技术等实际搜索引擎必须关注的技术,...
  • 对于实际搜索引擎所涉及的各种核心技术都有全面细致的介绍,除了作为搜索系统核心的网络爬虫、索引系统、排序系统、链接分析及用户分析外,还包括网页作弊、缓存管理、网页去重技术等实际搜索引擎必须关注的技术,...
  • 零、项目介绍 我们通过一个项目来学习WebApi和Vue的使用。...反爬虫 索引 二、初始化项目 建立如下图的项目结构 下面我来解释一下各个类库的作用 类库 说明 IServer 数据库操作接口类库 Server...
  • 学习篇(一)

    2020-05-13 11:40:05
    反爬虫定义:限制爬虫程序访问服务器资源和获取数据的行为称为反爬虫。限制手段包括但不限于请求限制、拒绝响应、客户端身份验证、文本混淆和使用动态渲染技术。可分为主动型反爬和被动型反爬。 二、javascript 1...
  • 作者简介崔广宇,携程酒店研发部小程序开发经理,曾负责过反爬虫开发以及H5开发。本文将分享携程酒店小程序的一些开发经验, 和一些非技术的经验。这里的小程序包括微信小程序,支...
  • webmagic使用手册

    千次阅读 2017-03-30 13:59:05
    webmagic是一个开源的Java...web爬虫是一种技术,webmagic致力于将这种技术的实现成本降低,但是出于对资源提供者的尊重,webmagic不会做封锁的事情,包括:验证码破解、代理切换、自动登录等。 作者黄亿华( code4c
  • 在进行网站爬取数据的时候,会发现很多网站都进行了反爬虫的处理,如JS加密,Ajax加密,反Debug等方法,通过请求获取数据和页面展示的内容完全不同,这时候就用到Selenium技术,来模拟浏览器的操作,然后获取数据。...
  • Python爬数据之全国中小学信息

    千次阅读 2018-07-08 22:10:03
    爬取网站:http://www.xuexiaodaquan.com/ 学校大全技术路线: requests + BeautifulSoup貌似这个网站反爬虫还挺牛的,经常就返回自动跳入的139网站,随意得换着IP试试需要准备中国市名称拼音存在EXCEL中,显示是...
  • 20001 面向互联网日志分布式实时ETL系统 运行视频、代码等: ...主要包括URL站内搜索关键词提取、请求串解析、json格式解析、反爬虫数据统计、session切割、时间格式化等等。 系统相关截图 # -*-
  • 美柚技术总监黄益聪分三部分和大家分享,分别是安全风险、安全防御体系和社区垃圾三部分。首先谈及美柚遭遇的各种攻击情况,比如流量攻击、爬虫抓取等;进而介绍了基于阿里云的安全防御体系,包括DooS防护和自研...
  • 对于实际搜索引擎所涉及的各种核心技术都有全面细致的介绍,除了作为搜索系统核心的网络爬虫、索引系统、排序系统、链接分析及用户分析外,还包括网页作弊、缓存管理、网页去重技术等实际搜索引擎必须关注的技术,...

空空如也

空空如也

1 2 3
收藏数 54
精华内容 21
关键字:

反爬虫技术包括

爬虫 订阅