精华内容
参与话题
问答
  • Python爬虫、反爬虫和反反爬虫

    千次阅读 多人点赞 2018-05-03 20:02:31
    我主要对反爬虫和反反爬虫做一个简单的总结我想补充一下关于爬虫和反爬虫,以及为什么要爬虫,为什么要反爬虫,也就是从技术和技术带来的影响的角度来看待爬虫。发现一个很有意思的链接,爬虫、反爬虫、反反爬虫 1 ...

    我主要对反爬虫和反反爬虫做一个简单的总结

    我想补充一下关于爬虫和反爬虫,以及为什么要爬虫,为什么要反爬虫,也就是从技术和技术带来的影响的角度来看待爬虫。发现一个很有意思的链接,

    爬虫、反爬虫、反反爬虫

     

    1 爬虫、反爬虫、反反爬虫

    爬虫 —— 使用任何技术手段批量获取网站信息的一种方式,关键在批量。

    反爬虫 —— 使用任何技术手段,阻止别人批量获取自己网站信息的一种方式。关键也在于批量。

    误伤 —— 在反爬虫的过程中,错误的将普通用户识别为爬虫。误伤率高的反爬虫策略,效果再好也不能用。

    拦截 —— 成功地阻止爬虫访问。通常来说,拦截率越高的策略,误伤率就越高,因此要做权衡。

    资源 —— 机器成本与人力成本的总和。

    2 常见的爬虫、反爬虫、反反爬虫手段

    爬虫、反反爬虫反爬虫
    对某个网站或者APP的数据感兴趣。 [1] 
    首先分析网站/APP [2]的请求与返回数据,然后用python,或Java,或网上免费的抓取软件,不断遍历某列表抓取数据存数据库。 
     zabbix等监控显示某时间段请求陡增,ip相同,useragent还是JavaClient,直接Nginx封杀这个ip
    useragent模仿谷歌或者百度浏览器,再获取十几个代理ip,爬的过程中不断轮询替换ip 
     发现ip不断变化,直接每次请求添加用户是否登录的校验
    通过注册等各种方法,获取一个真实账号,模拟登录,每次请求携带登录产生的cookie或者token 
     健全账号权限体系,即拥有A的账号,无法获取账号B的数据访问权限。
    设置定时器,简单粗暴的直接爬取所有能爬取的数据 
     针对多IP的高频访问,Nginx设置频率限制,如某个ip短时间访问超过一定次数就直接屏蔽,一定程度增加爬虫方获取有效IP的成本
    写代码爬取ip代理网站,或者批量购买高匿代理ip,几千IP轮询爬 
     在访问频率上继续做文章,升级ip限制策略,加大ip限制的成功率。
    ip大量被封,为了解决这问题,开始模拟人类请求特征,比如每半小时爬取改为随机1-3秒爬一次,爬10次休息10秒,每天只在8-1218-0点爬,隔几天还休息一下。再比如为了减少请求,能只抓列表页就不抓详情页 
     此刻再在访问频率上做限制,可能会误伤真实用户。如果网站类型不太注重用户体验,可以访问一定次数强制弹框要求输入验证码
    简单的验证码,完全可以自学图像识别的教程(关键词PILtesseract),对验证码进行二值化预处理,分割,模式训练后,识别验证码 
     针对具有用户行为的爬虫,首先要明白,爬虫与人类在访问特征上最大的不一样在于,人不会长时间持续访问一个网站,而爬虫的访问数量会随着时间增长而线性增长。根据这特征,分析请求日志,设置ip黑名单
    由于各种限制,单个爬虫轮询ip模拟用户行为进行爬取,效率已经大大降低。这个时候有条件,可以考虑分布式,跨省跨机房,利用ADSL进行长期爬取 
     既然无法避免被爬,那就继续加大对方爬取成本
    如果死磕到底。。 
     只能硬着头皮和他继续死磕,直到一方因为机器成本与人力成本问题放弃。

    3 为什么需要反爬虫?

    l  公司的重要资源被批量爬取,丧失竞争力。

    l  爬虫占总PV比例太高,因为高访问量浪费了太多钱。

    l  爬虫拖垮了站点,严重影响了用户体验。

    l  资源被爬取难以起诉成功,对方可以肆意爬取

    4 反爬虫的一些措施

    反爬虫的关键在于阻止被批量爬取,重点在批量。反爬虫技术的核心在于不断变更规则,比如不断变更验证码。我们在内容上可以做如下文章:

    l  网站不同地方的文本内容添加不同的自带标签,增加对方数据清理难度。

    l  关键数据由文本转图片,甚至添加水印等。目前市场上图片ocr识别无法有效转文字,让对方即使获取了图片也无法有效使用。

    l  网站相关页面的列表查询,限制总页数的展示。比如数据一共1K页,相关接口却只对外展示前十页。对方找不到入口最多爬取10页数据。

    l  间接关闭网站核心数据查看入口,比如内容的查看像百度文库一样改为word、pdf或者ppt下载模式,高频下载需要验证码或者账号积分。

    l  网站不提供注册入口,或者注册需要内部推荐或者评审,加大爬虫方获取账号的难度。

    l  网站的请求url复杂化,比如弄的像淘宝一样没有规律,id改为UUID等。

    l  前端页面尽可能不暴露数据的唯一键,对唯一键如主键id等进行伪装,可以增加对方爬取后的去重成本。因为对方爬数据可能是在你的多个模块页面进行多维度爬取,会有大量的重复数据。

    l  前端html页面别一次性加载列表,根据用户点击js动态加载。即查询页面源码时,只能看到列表的第一条数据。

    l  当确定访问异常时,大量返回虚假数据。爬虫几乎没有判断数据真假的能力,只有人才有。对方发现的越晚,我们的处理应对时间就越充裕。

    l  核心数据提高安全等级,单独加密等。


    展开全文
  • 本人是python新手,目前在看中国大学MOOC的嵩天老师的爬虫课程,其中一个实例是讲如何爬取淘宝商品信息 以下是代码: import requests import re def getHTMLText(url): try: r = requests.get(url, timeout=30)...

    淘宝反爬虫怎么办?
    python爬虫
    欢迎点赞

    因为评论有很多人说爬取不到,我强调几点

    1. kv的格式应该是这样的:
      kv = {‘cookie’:‘你复制的一长串cookie’,‘user-agent’:‘Mozilla/5.0’}
      注意都应该用 ‘’ ,然后还有个英文的 逗号,
    2. kv写完要在后面的代码中添加
      r = requests.get(url, headers=kv,timeout=30)

    自己得先登录自己的淘宝账号才有自己登陆的cookie呀,没登录cookie当然没用

    以下原博

    本人是python新手,目前在看中国大学MOOC的嵩天老师的爬虫课程,其中一个实例是讲如何爬取淘宝商品信息

    以下是代码:

    import requests
    import re
     
    def getHTMLText(url):
        try:
            r = requests.get(url, timeout=30)
            r.raise_for_status()
            r.encoding = r.apparent_encoding
            return r.text
        except:
            return ""
         
    def parsePage(ilt, html):
        try:
            plt = re.findall(r'\"view_price\"\:\"[\d\.]*\"',html)
            tlt = re.findall(r'\"raw_title\"\:\".*?\"',html)
            for i in range(len(plt)):
                price = eval(plt[i].split(':')[1])
                title = eval(tlt[i].split(':')[1])
                ilt.append([price , title])
        except:
            print("")
     
    def printGoodsList(ilt):
        tplt = "{:4}\t{:8}\t{:16}"
        print(tplt.format("序号", "价格", "商品名称"))
        count = 0
        for g in ilt:
            count = count + 1
            print(tplt.format(count, g[0], g[1]))
             
    def main():
        goods = '书包'
        depth = 3
        start_url = 'https://s.taobao.com/search?q=' + goods
        infoList = []
        for i in range(depth):
            try:
                url = start_url + '&s=' + str(44*i)
                html = getHTMLText(url)
                parsePage(infoList, html)
            except:
                continue
        printGoodsList(infoList)
         
    main()
    

    但是我们运行的时候会发现这个程序没有出错,但是爬取不到,原因是淘宝实施了反爬虫机制,r.text 时是登录界面,我们如何绕过登录界面进行爬取呢?

    首先我们需要先在浏览器中登录我们的个人淘宝,然后搜索以书包为例的商品,打开开发者模式(我使用的是chrome)或者按F12
    在这里插入图片描述
    这里我们可以看到我们当前的cookie和user-agent(一般是Mozilla/5.0)(注意:如果没有出现这几个name,点击浏览器刷新就会出现了)
    然后在代码中增加我们的cookie和user-agent
    在这里插入图片描述
    然后运行
    在这里插入图片描述

    我只是个初学者,学的时候视频给不了答案,百度了很多,才发现这个小技巧,
    有问题百度就完事了

    完整代码

    import requests
    import re
    
    
    def getHTMLText(url):
        kv = {'cookie':'t=5c749e8d453e7e3664735746f5eb5de8; cna=BrXNFDenbXUCAXggNKX9H1bo; thw=cn; tg=0; enc=5LMRHD8305w3oo8X0agYVFUDa7Ox%2F4RBf34oCWap48nRHy%2B%2B1RZCWZJ7ebn%2Fpy7vRNIL8xpS%2Ba0oNFXG5nSu8w%3D%3D; hng=CN%7Czh-CN%7CCNY%7C156; cookie2=10dbf1309bd9a2d5bc9cabe562965aee; _tb_token_=ee67e1a3ee0e5; alitrackid=www.taobao.com; swfstore=308730; v=0; unb=2448224718; sg=%E6%BB%A18d; _l_g_=Ug%3D%3D; skt=d53506c42f2db259; cookie1=BxUHGXuG%2B5Y4Iw7vZCvjLJ0zDvFL2Xy3mjxT%2FRPtFeA%3D; csg=4246b77f; uc3=vt3=F8dByEzfiHo1%2FUIk8VY%3D&id2=UUwU0bQkq1tYDQ%3D%3D&nk2=CN5OZuI3Xv2%2BlbVX&lg2=W5iHLLyFOGW7aA%3D%3D; existShop=MTU1MDU2MTUyMQ%3D%3D; tracknick=king%5Cu4E36%5Cu5C0F%5Cu4E30%5Cu6EE1; lgc=king%5Cu4E36%5Cu5C0F%5Cu4E30%5Cu6EE1; _cc_=VFC%2FuZ9ajQ%3D%3D; dnk=king%5Cu4E36%5Cu5C0F%5Cu4E30%5Cu6EE1; _nk_=king%5Cu4E36%5Cu5C0F%5Cu4E30%5Cu6EE1; cookie17=UUwU0bQkq1tYDQ%3D%3D; lastalitrackid=login.taobao.com; mt=ci=5_1; x=e%3D1%26p%3D*%26s%3D0%26c%3D0%26f%3D0%26g%3D0%26t%3D0%26__ll%3D-1%26_ato%3D0; uc1=cookie14=UoTZ5OXqJxXKdA%3D%3D&lng=zh_CN&cookie16=W5iHLLyFPlMGbLDwA%2BdvAGZqLg%3D%3D&existShop=false&cookie21=UIHiLt3xThH8t7YQouiW&tag=8&cookie15=UIHiLt3xD8xYTw%3D%3D&pas=0; JSESSIONID=F99B5E66516B99D5E7C9F431E402713F; l=bBNU0zKPvJ9oGfuLBOCNZuI8LN_OGIRYjuPRwCfMi_5B46JhzLQOllv3_FJ6Vj5RsK8B4z6vzNp9-etki; isg=BDg4VI5GkPAaMvx83RJGSPCNCeYKCZ0m9uCVOHKp6XNmjdh3GrU6uo2vQcWY5lQD; whl=-1%260%260%261550562673185',
              'user-agent':'Mozilla/5.0'}
        try:
            r = requests.get(url, headers=kv,timeout=30)
            r.raise_for_status()
            r.encoding = r.apparent_encoding
            return r.text
        except:
            return ""
    
    
    def parsePage(ilt, html):
        try:
            plt = re.findall(r'\"view_price\"\:\"[\d\.]*\"', html)
            tlt = re.findall(r'\"raw_title\"\:\".*?\"', html)
            for i in range(len(plt)):
                price = eval(plt[i].split(':')[1])
                title = eval(tlt[i].split(':')[1])
                ilt.append([price, title])
        except:
            print("")
    
    
    def printGoodsList(ilt):
        tplt = "{:4}\t{:8}\t{:16}"
        print(tplt.format("序号", "价格", "商品名称"))
        count = 0
        for g in ilt:
            count = count + 1
            print(tplt.format(count, g[0], g[1]))
    
    
    def main():
        goods = '书包'
        depth = 3
        start_url = 'https://s.taobao.com/search?q=' + goods
        infoList = []
        for i in range(depth):
            try:
                url = start_url + '&s=' + str(44 * i)
                html = getHTMLText(url)
                parsePage(infoList, html)
            except:
                continue
        printGoodsList(infoList)
    
    
    main()
    

    python爬虫

    淘宝反爬虫怎么办

    展开全文
  • 反爬虫

    2020-04-08 23:16:37
    爬虫的具体介绍就不说了,这里想对自己多年的爬虫中遇到的情况进行一个总结 1.模拟浏览器 2.Ip 3.登录 4.验证码 5.各种信息加密 6.请求频率 1.模拟浏览器 目前度娘一搜一大把,最集中的就是ua了,搭建一个...

    爬虫的具体介绍就不说了,这里想对自己多年的爬虫中遇到的情况进行一个总结

    1.模拟浏览器

    2.Ip

    3.登录

    4.验证码

    5.各种信息加密

    6.请求频率

     

    1.模拟浏览器

    目前度娘一搜一大把,最集中的就是ua了,搭建一个随机ua池,不断的变化ua,很普遍的方法, 这里推荐一个大神写的开源库 fake-useragent https://github.com/hellysmile/fake-useragent 简单好用
    防盗链,抓取图片经常会遇到,最简单的方式就是获取其Referrer,放到自己的 headers 中,具体自行度娘
    cookie,这是一个最常见的反爬手段之一了,可以把它和登录放在一起。有些不需要登录的网站也会通过cookie来过滤一些没有经过伪装的爬虫,有些网站会在cookie中加入时间戳,然后加密。这些网站服务器会根据cookie设置过期时间;so,我们需要一个cookie池了,使用requests会很方便的搭建一个cookie池,当然了,强烈推荐requests大神的新作 requests-html,可以执行js,自己翻页什么的(偶像)
    其他一些参数,请求头是反爬虫的重要手段和常用伎俩之一,我们如果发现数据没有,或者有问题,一定一定注意一些,通过抓包仔细分析
     
    2.ip,请求频繁

    很多新手或者某些人为了利益,制造很多的暴力爬虫(不限速,高并发请求),这会造成对方服务器压力巨大,甚至是死机,建议大家在练习或者工作的时候;养成良好的习惯,这是相互的过程,如果你很良好的请求。对方服务器没那么大压力,他的一些不那么重要的数据还是会很开心的让你访问的
    其实代理ip很简单,requests, scrapy都有自己的方法来设置,网上也有很多的免费(西刺免费代理),付费代理(阿布云)等等,代理是没有办法的办法,毕竟我们自己的ip才是速度最快的,如果真的需要频繁更换代理Ip,建议搭建一个自己的代理ip池,定时监测,删除。
    3.登录

    可以用requests模拟登录,网上有很多,一般登录之后,保存cookie就可以了;当然注意我上面说的cookie过期时间,如果嫌麻烦,登录最常用的就是selenium了,简单快捷
    4.验证码

    网上打码平台很多,也有详细的API,如果嫌麻烦,当然还是首选selenium(万金油),不过selenium会降低抓取的速度,请大家根据需要进行选择
    5.信息加密

    这类数据多用在一些核心的信息(价格,电话,图片等),有的使用js包裹,有的使用加密函数(sha,bas64,md5等等)
    加密数据的典型就是某8同城了,它的价格可以看到,拿到是乱码一样的东西(生僻字?)。通过抓包,会发现它有一个自己的字符编码。然后还有解密什么的,度娘有人写过
    总结:

    简单总结了我遇到的一些基本反爬手段,当然实际运用中会有各种意想不到的情况。数据是未来的一个基础。反爬工程师会越来越精明。采集数据难度也会越来越大,当然如果我们合理运用;不对对方造成压力,对方还是会网开一面的(核心数据除外)这里推荐我学习的资料, 崔大大的爬虫书(python3网路爬虫开发实战)python核心3,还有一些视频:传智播客,慕课网的爬虫视频。. 一些学习网站:实验楼,菜鸟教程,w3cSchool,廖雪峰廖大大的官网,当然还有我们的度娘
    总结,回顾,不断的学习。才可以有更好的进步
    ————————————————
    版权声明:本文为CSDN博主「GaryLea」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/li_g_yuan/java/article/details/86656964

    展开全文
  • 关于爬虫和反爬虫

    2016-12-05 23:02:23
    关于爬虫和反爬虫

    前几天,听了一个关于爬虫的讲座,这里分享下,同时也帮助自己理解更深刻些。

    一.制作爬虫:

    1)..http请求获取数据,正则表达式解析。PS:这种爬虫的比例超过一半。

    2).javascript生成参数,访问ajax站点。

    3).浏览器渲染页面,获取渲染结果。

    第一种爬虫: http方式获取数据。

    案例:假如要对某站点A进行爬虫,希望能够获取它下面的所有资源:

    第一步. 

    使用wireshark分析,当在浏览器或者app端进行访问的时候,发出请求url的格式。

    当发现发出的请求中有大量这个格式的数据时候,单击链接可以看到返回正确数据(常见json\xml格式)时候,说明这个就是客户端获取数据的url,对这种url分析,发现其域名、参数含义。

    比如:http://www.xx.yy/aaa/filter?start=0&size=20&userId=&category=21&City=%E4%B8%8A%E6%B5%B7

    www.xx.yy:域名

    category:目录。(可能网页菜单栏中的一个选项对应一个category)

    City:城市名。(网上可以查询出所有的城市名称数据)

    第二步.

    使用循环,url + 动态参数数据(从xml或者properties文件中读取),发起请求,获取数据。

    下面有一个获取图片的小代码,对别的资源,比如json中某个节点是子目录的网址连接url,也是正则表达式去匹配。

    	// 编码
    	private static final String ECODING = "UTF-8";
    	// 获取img标签正则
    	private static final String IMGURL_REG = "<img.*src\\s*=\\s*(.*?)[^>]*?>";// <img.*src=(.*?)[^>]*?>
    	// 获取src路径的正则
    	private static final String IMGSRC_REG = "http:\"?(.*?)(\"|>|\\s+)";
    	// 获取src02路径的正则
    	private static final String IMGSRC_REG_02 = "src\\s*=\\s*\"?(.*?)(\"|>|\\s+)";
            .........
    	/***
    	 * 获取HTML内容
    	 * 
    	 * @param url
    	 * @return
    	 * @throws Exception
    	 */
    	public String getHTML(String url) throws Exception {
    		URL uri = new URL(url);
    		URLConnection connection = uri.openConnection();
    		InputStream in = connection.getInputStream();
    		byte[] buf = new byte[1024];
    		int length = 0;
    		StringBuffer sb = new StringBuffer();
    		while ((length = in.read(buf, 0, buf.length)) > 0) {
    			sb.append(new String(buf, ECODING));
    		}
    		in.close();
    		return sb.toString();
    	}
    
    
    	/***
    	 * 获取ImageUrl地址
    	 * 
    	 * @param HTML
    	 * @return
    	 */
    	public List<String> getImageUrl(String HTML) {
    		Matcher matcher = Pattern.compile(IMGSRC_REG).matcher(HTML);
    		List<String> listImgUrl = new ArrayList<String>();
    		while (matcher.find()) {
    			listImgUrl.add(matcher.group().substring(0,
    					matcher.group().length() - 1));
    		}
    		return listImgUrl;
    	}
    第三步:保存数据 (存到本地,或者写入数据库)

    /***
     * 下载图片
     * 
     * @param listImgSrc
     */
    public void Download(List<String> listImgSrc) {
    	try {
    		for (String imgSrc : listImgSrc) {
    			imgSrc = imgSrc.replace(" ", "");
    			String imageName = imgSrc.substring(
    					imgSrc.lastIndexOf("/") + 1, imgSrc.length() - 1);
    			URL uri = new URL("http://www.xxx.yy/images/" + imageName);
    			String localPath = "d:\\downfiles\\images\\" + imageName;
    			InputStream in = uri.openStream();
    			File file = new File(localPath);
    			if (!file.getParentFile().exists()) {
    				file.getParentFile().mkdirs();
    			}
    			try {
    				file.createNewFile();
    			} catch (IOException e) {
    				e.printStackTrace();
    			}
    
    			FileOutputStream fo = new FileOutputStream(file);
    			byte[] buf = new byte[1024];
    			int length = 0;
    			System.out.println("开始下载:" + imgSrc);
    			while ((length = in.read(buf, 0, buf.length)) != -1) {
    				fo.write(buf, 0, length);
    			}
    			in.close();
    			fo.close();
    			System.out.println(imageName + "下载完成");
    		}
    	} catch (Exception e) {
    		System.out.println("下载失败");
    	}
    }

    /*写入数据库*/
    private static Connection getConn() {
    	String driver = "com.mysql.jdbc.Driver";
    	String url = "jdbc:mysql://localhost:3306/grabdb";
    	String username = "root";
    	String password = "123456";
    	Connection conn = null;
    	try {
    		Class.forName(driver); // classLoader,加载对应驱动
    		conn = (Connection) DriverManager.getConnection(url, username,
    				password);
    	} catch (ClassNotFoundException e) {
    		e.printStackTrace();
    	} catch (SQLException e) {
    		e.printStackTrace();
    	}
    	return conn;
    }
    
    public int insert(FileInfo fileInfo) {
    	Connection conn = getConn();
    	int i = 0;
    	String sql = "insert into fileinfo (fileType,url,fileName,localPath,currentCity,relationJsonName) values(?,?,?,?,?,?)";
    	PreparedStatement pstmt;
    	try {
    		pstmt = (PreparedStatement) conn.prepareStatement(sql);
    		pstmt.setString(1, fileInfo.getFileType());
    		pstmt.setString(2, fileInfo.getUrl());
    		pstmt.setString(3, fileInfo.getFileName());
    		pstmt.setString(4, fileInfo.getLocalPath());
    		pstmt.setString(5, fileInfo.getCurrentCity());
    		pstmt.setString(6, fileInfo.getJsonName());
    
    		i = pstmt.executeUpdate();
    		pstmt.close();
    		conn.close();
    	} catch (SQLException e) {
    		e.printStackTrace();
    	}
    	System.out.println("数据插入成功!");
    	return i;
    }

    第二种爬虫:

    待续......

    展开全文
  • 反爬虫-反反爬虫

    2020-07-24 15:52:29
    一、常见的反爬虫手段 1、User_Agent 浏览器类型、版本信息等 2、Referer 表示我们从哪个连接跳转过来的 3、Cookis 登录信息 二、常用的反反爬虫手段 1、模拟用户浏览器的User_Agent 2、模拟用户登录 (1) requestes...

空空如也

1 2 3 4 5 ... 20
收藏数 5,170
精华内容 2,068
关键字:

反爬虫

爬虫 订阅