大牧夜话——爬虫篇

爬虫正传-江湖路远-0103-入乡随俗

2018-05-14  本文已影响0人  大牧莫邪

尽管已经可以行侠仗义,但是初入江湖的少侠依然少了很多江湖经验,完全不顾及别人的饭碗,疯狂的数据采集造成的压力引起了服务器地主们的注意,发现系统资源严重消耗,于是对服务器处理的用户请求进行了分析,发现了原来是有一个客户端在短时间无限制的发起了太多请求,于是对该客户端直接进行了屏蔽

散养的少侠

那么对于这样的情况,应该怎么进行操作呢,总管金古梁(金庸、古龙、梁羽生)的江湖系列,所有的少侠都是拿经历买经验,经验积累了自然就明白江湖套路了

我们通过大致模拟用户操作行为的习惯,完成对服务器检查的欺骗性伪装
既然程序自动操作会在短时间发起大量请求造成服务器压力,那么就让我们的爬虫程序每次请求之间间隔一定的时间再去执行
看下面的代码,我们采集新浪新闻数据
经过分析,新浪国内新闻列表是通过ajax进行数据请求和页面渲染的,请求地址如下:

[http://api.roll.news.sina.com.cn/zt_list?channel=news&cat_1=gnxw&cat_2==gdxw1||=gatxw||=zs-pl||=mtjj&level==1||=2&show_ext=1&show_all=1&show_num=22&tag=1&format=json&**page=7**&callback=newsloadercallback&_=1526055059562](http://api.roll.news.sina.com.cn/zt_list?channel=news&cat_1=gnxw&cat_2==gdxw1||=gatxw||=zs-pl||=mtjj&level==1||=2&show_ext=1&show_all=1&show_num=22&tag=1&format=json&page=7&callback=newsloadercallback&_=1526055059562)

PS:上述地址是从新浪服务器获取新闻数据时抓包得到的新闻数据请求地址
并根据目标数据分析,目标url地址的请求page参数范围是1~15
这也就意味着我们要对15个地址进行数据采集操作

现在是真正展现技术的时候了
工作目录:/home/damu/work_spider/spider_01/
创建爬虫程序:demo03_useropration.py

# coding:utf-8

import random, time

from urllib2 import urlopen

from urllib2 import Request

# 构建新闻请求地址列表

base_url =

“[http://api.roll.news.sina.com.cn/zt_list?channel=news&cat_1=gnxw&cat_2==gdxw1||=gatxw||=zs-pl||=mtjj&level==1||=2&show_ext=1&show_all=1&show_num=22&tag=1&format=json&page={}&callback=newsloadercallback&_=](http://api.roll.news.sina.com.cn/zt_list?channel=news&cat_1=gnxw&cat_2==gdxw1||=gatxw||=zs-pl||=mtjj&level==1||=2&show_ext=1&show_all=1&show_num=22&tag=1&format=json&page=%7b%7d&callback=newsloadercallback&_=1526055059562)” + str(int(time.time()*1000))

urllists = [base_url.format(n) for n in range(1, 16)]

# 构建请求头对象

headers = {

    “User-agent”: “...”

}

# 循环采集数据

for index, next_url in enumerate(urllists):

# 模仿用户行为每次请求之间间隔1~20秒钟

time.sleep(random.randint(1, 20))

    # 构建请求对象

    request = Request(next_url, headers=headers)    

    # 采集数据

response = urlopen(request)

# 转换文件内容编码,将unicode转换成中文

content = response.read()

content =

     content.encode(‘utf-8’).decode(’unicode_escape’)

    # 保存数据到文件中

    with open(str(index) + “.json”, “wb”) as f:

        f.write(content.encode(‘utf-8’))

执行上述程序,最终会采集到15个包含新闻数据的json文件
在此过程中,并没有用到爬虫相关的新技术,而是通过符合自然用户的操作习惯进行的一种模拟伪装操作,也是爬虫采集数据过程中必须要掌握的一种解决服务器反爬虫限制的手段!

小结:这一部分中最重要的是自然用户行为,因为爬虫本身需要频繁采集数据和自然用户浏览数据有相同之处,都是需要从服务器获取数据,只要爬虫程序伪造请求头就可以接入服务器,但是爬虫程序和自然用户不同的是程序执行速度要比自然人的执行速度快速太多,所以很容易被服务器维护人员剔除该类型请求,所以通过程序模拟人的行为也是一种需要掌握的方式。所以~亲爱的少侠,爬虫要掌握的不仅仅是攻城略地的技术,还需要掌握那么一丢丢社会学的知识吆

上一篇下一篇

猜你喜欢

热点阅读