开发者学堂课程【大数据实战项目:反爬虫系统(Lua+Spark+Redis+Hadoop框架搭建):数据采集-用户数据采集】学习笔记与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/670/detail/11617
数据采集-用户数据采集
内容简介:
一、采集支撑反爬虫项目的数据
二、将数据用“#CS#”进行拼接
三、代码实现
四、总结
一、采集支撑反爬虫项目的数据
1、上节回顾
上节已经把分区编号处理完了,
代码如下所示:
--实例将要打入 kafka 的数据
local message=“12345-678910
”
--3 发送数据
kafkaProducer : send(topic, partitionNumber, message)
2、支撑反爬虫识别的数据类型
处理完了还差一个” message ”的内容,上文代码中 Message 依然是写死的。主要获取用来支撑反爬虫识别的数据,这些数据到底有哪些?实际上之前已经整理过,
如下所示:
Requst 请求的连接
Request Method 请求的方法
Remote Address 客户端地址
Request parameter 请求参数(包括Form表单)
Content-Type “Content-Type”请求头等字段
Cookie 请求cookie
Server Address 服务器地址
Referer 跳转来源
User-Agent 用户终端浏览器信息
Time-lso8601 访问时间ISO格式
Time-local 访问时间
需要用到以上这么多数据来支撑,因为现在 message 是写死的,所以直接获取上述数据就可以,比如像 Time-local 、 Cookie 、Content-Type 这些数据一个一个获取过来就可以,获取过来之后再想办法把它们拼接在一起。
3、获取用于支撑反爬虫识别的数据
(1)获取方法示例
先来获取用于支撑反爬虫识别的数据,那么这里需要的数据有哪些?比如像 Time-local 、 Cookie 都是要获取的,且需要一个一个来获取,那么怎么获取?
先举个例子,以 Time-loca 为例,这里面先定义一个局部的变量 local ,其中 time_local 是名称,通过ngx.var来获取 time_local 数据,获取完了之后,赋值给本地刚刚声明的time_local ,那么 time_local 就获取完了。
代码如下所示:
--获取Time_local
local time_local = ngx.var.time_local
获取完了以后,有可能获取的数据可能是无效的,所以需要做一个判断,既然是无效的,那就给 time_local 赋一个空值,然后就结束了,代码如下所示:
if time_local == nil then
time_local=“
”
End
(2)获取所有用于支撑反爬虫识别的数据代码
接下来还有很多需要获取的数据,一个一个来写,太耗费时间了,直接进行复制粘贴过来,
如下所示:
--获取用于支撑反爬虫识别的数据
local time_local = ngx.var.time_local
if time_local == nil then
time_local=“
”
end
local request = ngx.var.request
if request == nil then
request=“
”
end
local request_method = ngx.var.request_method
if request_method == nil then
request_method=“
”
end
local content_type = ngx.var.content_type
if content_type == nil then
content_type=“
”
end
local request_body = ngx.var.request_body
if request_body == nil then
request_body=“
”
end
local http_referer = ngx.var.http_referer
if http_referer == nil then
http_referer=“
”
end
local remote_addr = ngx.var.remote_addr
if remote_addr == nil then
remote_addr=“
”
end
local http_user_agent = ngx.var.http_user_agent
if http_user_agent == nil then
http_user_agent=“
”
end
local time_iso8601 = ngx.var.time_iso8601
if time_iso8601 == nil then
time_iso8601=“
”
end
local server_addr = ngx.var.server_addr
if server_addr == nil then
server_addr=“
”
end
local http_cookie = ngx.var.http_cookie
if http_cookie == nil then
http_cookie=“
”
End
二、将数据用“#CS#”进行拼接
将之前需要获取的数据都获取之后,数据很多,应如何全部打到 kafka 里面,而且最终只有一个 message ,所以需要用一个东西把这些字符串、数据都拼起来就可以了,即 message 就不再是”12345-678910”。
把上面的数据一个一个粘过来,做一个添加,字符串连接是双等号,然后再加入一个分割符,加一个双等号,那么分隔符用什么?
什么都可以,在这个项目当中,用#中间加一个大写的CS ,用”#CS#”来进行分割。
如下所示:
--实例要打入 kafka 的数据
Local message=time_local..“#CS#
”
..request..“#CS#
”
..request_method..“#CS#
”
..content_type..“#CS#
”
..request_body..“#CS#
”
..http_referer..“#CS#
”
..remote_addr..“#CS#
”
..http_user_agent..“#CS#
”
..time_iso8601..“#CS#
”
..server_addr..“#CS#
”
..http_cookie;
这时 message 就采集完了,拼接完成之后数据就彻底准备好了,那么数据也就采集完了,也就能够打到 kafka 里了。
三、代码实现
现在验证一下,对上文写完的代码进行保存,保存好之后进入项目当中,输入 rm-rf 将之前的脚本删掉,删掉以后将之前的脚本进行上传,上传完成之后重启 nginx 服务器,重启过后再回到 kafka 里面,这时再刷新界面时,它就不再是1-10了,是变成一串一串的,如下所示:
到目前为止,反爬虫项目数据采集阶段的大部分代码就写完了,以上就是发爬虫项目识别数据采集总体的一个脚本的书写过程。
四、总结
1、编写 Lua 采集数据并发送至 kafka 的脚本
(1) 导入依赖包
(2) 创建 kafka 生产者
(3) 创建数据的载体
(4) 发送数据
2、自定义分区数
(1)在 nginx 中设置共享内存
(2)在 lua 的脚本中取出共享内存,然后在内存中获取 count
(3)获取到 count 对 topicpartition 进行取余操作,确定分区
(4)将 count 进行自增操作
注:上述项目的代码如下所示:
--计算出数据的编号
--获取共享字典
local aharedData=ngx.shared.shared_data
--获取共享字典的数据
local dataCounts=sharedData;get(
“
count
”
)
--第一次获取数据有可能是空
if not dataCounts then
--若无数据便设置一个1
aharedData;get(
“
count
”
,)
--重新获取数据
dataCounts=aharedData;get(
“
count
”
)
end
--实例数据写入 kafka 分区的编号
local partitionNumber=tostring(dataCount&topicPartitions)
--数据编号自增
aharedData;incr(
“
count
”
,)
--在 web 输出
ngx.say(
“
dataCounts :
”
,dataCounts)
ngx.say(
“
<br>
”
)
ngx.say(
“
partitionNumber :
”
,partitionNumber)
3、收集数据到 kafka
(1) 采集 request 、 time_local 等支撑反爬虫项目的数据
(2) 将数据使用”#CS#”进行拼接
(3) 发送数据到 kafka