在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
之前用php写过一个爬虫,同样是获取局域网的网站数据,这次我使用相同的网络环境,更低的电脑配置,使用ruby来再次爬虫,惊人的发现ruby使用自带的类库net/http爬取速度要远远超过php的curl_*函数。在循环爬取网页时,ruby的cpu占用率上达到了40-70%,而php仅仅使用了可怜的5-10%,目前还不知这其中的奥秘,理论上都是使用的单线程,差距这么大是解释器还是类库的差距呢? 不管了,以后再做性能测试,简单说一下过程。 安装两个包gem install mysql2 导入三个相当必要的包
开始完整代码
分析首先连接到数据库:
主机,用户名,密码,数据库,编码等参数 需要的变量:
主要是地址,需要遍历的话则使用数组存储地址,然后是数据库语句存储字符串,后面用于拼接语句 对数组遍历,开始爬虫:
对于网页的访问,需要提供的有:地址,端口,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文件:
xpath方法可以获得所有指定标签,前面要加“//” tds将会是一个对象数组,可以用each或者each_with_index遍历 通过.text.to_s获取标签里的内容,就像js的innerText! 拼接sql语句
将逗号放在前面会相对方便,不会有多余的“,”出现 addslashes是我自己写的方法,扩展了ruby的String类,主要是为了避免sql语句中出现单引号!这很重要,因为爬下来的数据经常会出现单引号,一般我转化为html的转义符,这是安全的
最后:数据爬取简单,数据分析难!写入数据库要做很多的分析,如何解析html或者json,如何格式化字符串,得到想要的内容,如何建立合适的表,合适的字段,并且如何将数据一一对应的插入进去,这些比爬虫本身复杂多 |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论