Ruby爬虫header发送cookie,nokogiri解析html数据
来源:互联网 发布:淘宝介入买家都能赢吗 编辑:程序博客网 时间:2024/06/07 18:59
之前用php写过一个爬虫,同样是获取局域网的网站数据,这次我使用相同的网络环境,更低的电脑配置,使用ruby来再次爬虫,惊人的发现ruby使用自带的类库net/http爬取速度要远远超过php的curl_*函数。在循环爬取网页时,ruby的cpu占用率上达到了40-70%,而php仅仅使用了可怜的5-10%,目前还不知这其中的奥秘,理论上都是使用的单线程,差距这么大是解释器还是类库的差距呢?
不管了,以后再做性能测试,简单说一下过程。
安装两个包
gem install mysql2
gem install nokogiri
导入三个相当必要的包
require 'net/http'require 'mysql2'require 'nokogiri'
- net/http相当于php的curl函数,可以实现http请求,模拟浏览器一样的请求,发送给http服务器得到返回数据。
- mysql2,mysql连接,相当于java的jdbc,实现数据库读写
- nokogiri,这是一个html的dom解析类库,可以快速的解析html,获得节点下的属性,文本,子节点等
开始
完整代码
require 'net/http'require 'mysql2'require 'nokogiri'client = Mysql2::Client.new(:host => 'localhost',:username => 'root', :database => 'cslg', :encoding => 'utf8');url = []#示例网站罢了url << "http://www.baidu.com"sql = ""url.each do |u| u = URI(u); http = Net::HTTP.new(u.host,u.port); headers = { 'Cookie'=>''#设置访问时的cookie,如果没有则不需要传入这个headers散列 } doc = http.get(u,headers) #发送请求 html = Nokogiri::HTML(doc.body) #html格式化 tds=html.xpath("//td") #找到所有的td标签 #过滤爬取得空或者废页面,根据实际返回页面的数据量,比如td标签过少的就是空的,不存在的 if tds.size < 79 next end #数据库语句准备好 sql ="insert into teacher_base_info values(null" tds.each_with_index do |td,i| if i<74 && i>8 text = td.text.strip if !(text.include?":") sql+=",'#{text.to_s.addslashes}'" elsif i==57 || i==66 || i==73 #拼接数据库语句 sql+=",'#{text.split(":")[1].to_s.addslashes}'" end end end sql+=")" puts sql client.query(sql)end
分析
首先连接到数据库:
client = Mysql2::Client.new(:host => 'localhost',:username => 'root', :password=>'' :database => 'xxx', :encoding => 'utf8');
主机,用户名,密码,数据库,编码等参数
需要的变量:
url = []url << "http://www.baidu.com"sql = ""
主要是地址,需要遍历的话则使用数组存储地址,然后是数据库语句存储字符串,后面用于拼接语句
对数组遍历,开始爬虫:
u = URI(u); http = Net::HTTP.new(u.host,u.port); headers = { 'Cookie'=>''#设置访问时的cookie,如果没有则不需要传入这个headers散列 } doc = http.get(u,headers)
对于网页的访问,需要提供的有:地址,端口,get参数(或者post参数),还有header中的信息
那么对于那些需要登录的网站,往往需要提供cookie来保持会话,那么headers变量可以存储散列,将键值对放入其中,就可以发送请求同时发送已经登录获得的cookie
cookie的值从开发者工具中获取,chrome F12
headers变量键值对遵循上面的规则,并且Ruby中使用“=>”定义散列中的元素
URI类,URI方法可以格式化字符串地址,成为uri对象
Net::HTTP.new()返回一个http对象,调用get方法可以访问地址,第一个是uri对象,第二个是header散列,提供header信息
如果我的地址中存在?x=xx&y=yy&z=zz这样的的get参数呢?
依然使用上述方法!将u=URI(地址包括get)取得的u传入http.get的第一个参数,get中的参数会被自动发送到http,并不会遗漏
解析html
爬下来之后,需要对html进行解析,ruby我采用了nokogiri,php可以使用“Simple HTML DOM”
使用nokogiri格式化取得的html文件:
html = Nokogiri::HTML(doc.body) #html格式化tds=html.xpath("//td") #找到所有的td标签
xpath方法可以获得所有指定标签,前面要加“//”
tds将会是一个对象数组,可以用each或者each_with_index遍历
通过.text.to_s获取标签里的内容,就像js的innerText!
nokogiri使用说明
拼接sql语句
sql+=",'#{text.to_s.addslashes}'"sql+=",'#{text.split(":")[1].to_s.addslashes}'"
将逗号放在前面会相对方便,不会有多余的“,”出现
addslashes是我自己写的方法,扩展了ruby的String类,主要是为了避免sql语句中出现单引号!这很重要,因为爬下来的数据经常会出现单引号,一般我转化为html的转义符,这是安全的
class String def addslashes self.gsub(/\'/,''') endend
最后:数据爬取简单,数据分析难!写入数据库要做很多的分析,如何解析html或者json,如何格式化字符串,得到想要的内容,如何建立合适的表,合适的字段,并且如何将数据一一对应的插入进去,这些比爬虫本身复杂多
- Ruby爬虫header发送cookie,nokogiri解析html数据
- Nokogiri解析html/xml
- Ruby - Nokogiri 解析XML的实例
- HTML解析,网络爬虫
- HTML解析,网络爬虫
- 解析爬虫, Document解析html
- 【解析HTML】HTML解析,网络爬虫
- 爬虫-jsoup 数据解析
- JMeter模拟请求发送,并带上自定义Header,参数,Cookie
- php通过header发送自定义数据
- php通过header发送自定义数据
- php通过header发送自定义数据
- 创建爬虫----复杂HTML解析
- python爬虫之html解析
- 爬虫之pyquery 解析html
- 发送HTML表单数据
- ruby发送带header的http请求 (Send Custom Headers Ruby Net::HTTP)
- Python爬虫:一些常用的爬虫技巧总结(IP,cookie,header,多线程)
- Linux驱动修炼之道-SPI驱动框架源码分析(上)
- handler/handlerThread使用2
- Seeder自动填充测试数据
- 推荐系统中显性反馈数据和显性反馈数据的比较
- android知识大纲
- Ruby爬虫header发送cookie,nokogiri解析html数据
- 背包问题
- 解决ArrayList线程不安全
- Java并发编程:如何创建线程?
- 愿世界对我温柔以待
- React Navigation--Stack Navigator 详细的例子
- qml 截屏功能
- DDL、DML、视图、序列、索引、导入导出、pl/sql简述(Oracle之一)
- ssh_by_list