zoukankan      html  css  js  c++  java
  • 反爬1

    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('<h1>(.*?)</h1>.*?<h2>(.*?)</h2>')
    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'<div.*?mm-p-domain-info">.*?class="mm-p-info-cell clearfix">.*?<li>.*?<label>(.*?)</label><span>(.*?)</span>',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()
    
  • 相关阅读:
    推荐一个wpf&sliverlight的图表控件
    数独求解
    WPF中的 CollectionChanged事件通知
    Windows 7 任务栏之缩略图预览(Thumbnail)
    把Google HK设为IE默认的搜索引擎
    F#小记——1. Hello F#
    F#小记——2. 基本数据类型
    使用异步socket的时候需要注意memory spike
    《everytime you kissed me》的中文歌词
    我回来了o(∩_∩)o...
  • 原文地址:https://www.cnblogs.com/whnbky/p/13060644.html
Copyright © 2011-2022 走看看