试想一下,如果每天要收集100页网页数据甚至更多。如果采用人工收集会吐血,用程序去收集也就成为一个不二的选择。首先肯定会想到说用java、php、C#等高级语言,但这偏偏又有个登陆和验证码,搞到无所适从。还在为收集web端的数据感到苦恼吗?很高兴,你找对地方了。

  应用场景:

    1、需要每天大量重复收集web端的数据

    2、web页面数据需要登陆后才能采集

    3、web页面存在翻页

  解决方案:

    手工登陆,然后采用chrome插件的方式进行收集。当然你会说用selenium等自动化测试的方法进行收集更cool,而且可以每天自动收集,完全的自动化不用人工参与。但是作为chrome的忠实脑残粉,再者只需要前端的js、服务器端的接收文件、数据库就可以完美解决这一问题。再加上部署和操作简单。 脑残粉总有很多理由的嘛。好吧,就算是一种憋屈的曲线救国和实现方式吧。

  思路:

    

帮助手册:http://open.chrome.360.cn/extension_dev/overview.html

实例:

抓取某电商后台订单数据

1、创建一个项目文件夹并引入所需文件:如D:\tool\chrome_server_plugin

  jquery-2.1.1.min.js、icon.png

2、创建background.html

  1. <html><head>
  2. </head></html>

3、创建配置文件manifest.json文件

  1. {
  2.  
  3. "name": "获取某电商后台订单信息",
  4. "version": "1.0",
  5. "manifest_version": 2,
  6. "description": "*********获取某电商后台订单信息*********",
  7. "browser_action": {
  8. "default_icon": "icon.png"
  9. },
  10. "permissions": [
  11. "webNavigation",
  12. "tabs",
  13. "contextMenus",
  14. "http://服务器接受数据url/"
  15. ],
  16. "background": {
  17. "scripts": ["eventPage.js","jquery-2.1.1.min.js"]
  18. },
  19. "content_scripts": [
  20. {
  21. "matches": ["http://抓取页面url/*"],
  22. "js": ["jquery-2.1.1.min.js", "contentscript.js"]
  23. }
  24. ]
  25. }

4、创建前端js文件contentscript.js

  1. var totalPage;
  2. var page = 0;
  3. //注册前台页面监听事件
  4. chrome.extension.onMessage.addListener(
  5.   function(request, sender, sendResponse) {
  6.     totalPage = $("input[name=totalPage]").val();
  7.     console.log("totalPage----------" + totalPage);
  8.     //console.log("msg----------contentscript.js" + request.greeting);
  9.     getOrderInfo( sendResponse );
  10.   });
  11.  
  12. //获取订单信息
  13. function getOrderInfo( sendResponse ){
  14.   var flag = false;
  15.  
  16.   payMoney = [];//货款金额
  17.   orderTime = [];//下单时间
  18.   $("tr[class=head] span").each(function(index){
  19.     spantxt = '';
  20.     spantxt = $(this).text();
  21.     if(spantxt.indexOf('货款金额:') > -1){
  22.       money = spantxt.substr(5);
  23.       //console.log(index + "---------payMoney-------货款金额:" + money);
  24.       payMoney.push(money);
  25.     }else if(spantxt.indexOf('下单时间:') > -1){
  26.       time = spantxt.substr(5);
  27.       //console.log(index + "---------orderTime-------下单时间:" + time);
  28.       orderTime.push(time);
  29.     }
  30.   });
  31.  
  32. paytype = [];//物流方式
  33. yunfei = [];//运费
  34. $("td[class=p-values]").each(function(index){
  35.   tdtxt = '';
  36.   tdtxt = $(this).text();
  37.   if(tdtxt.indexOf('货到付款') > -1){
  38.     paytype.push('货到付款');
  39.   }else{
  40.     paytype.push('在线支付');
  41.   }
  42.  
  43.   yf_index = tdtxt.indexOf('运费:');
  44.   if(yf_index > -1){
  45.     temp = tdtxt.substr(yf_index);
  46.     temp_yf = temp.substr(3);
  47.     //console.log(index + "---------yunfei-------"+ temp +"===" + temp_yf);
  48.     yunfei.push(temp_yf);
  49.   }else{
  50.     yunfei.push(0);
  51.   }
  52.  
  53.   //console.log(index + "---------tdtxt-------" + tdtxt);
  54. });
  55.  
  56. orderStatus = [];//订单状态
  57. users = [];//买家账号
  58. remark = [];//备注
  59. $("tr[class=content] td[class=t-c]").each(function(index){
  60.   tdtxt = '';
  61.   tdtxt = $(this).text().replace(/[\r\n]\ +/g,"");//将回车,换行,空格去掉
  62.   temp = index % 5;
  63.   if(1 == temp){
  64.     orderStatus.push(tdtxt);
  65.     //console.log(index + "---------statu-------" + tdtxt);
  66.   }else if(2 == temp){
  67.     users.push(tdtxt);
  68.     //console.log(index + "---------users-------" + tdtxt);
  69.   }else if(3 == temp){
  70.     remark.push(tdtxt);
  71.     //console.log(index + "---------remark-------" + tdtxt);
  72.   }
  73. });
  74.  
  75. express = [];//快递单号
  76. $("tr[class=content] td div[style='text-align: center;']").each(function(index){
  77.   tdtxt = '';
  78.   tdtxt = $(this).text().replace(/[\r\n]\ +/g,"");//将回车,换行,空格去掉
  79.   express.push(tdtxt);
  80.   //console.log( "============快递单号=======" + tdtxt);
  81. });
  82.  
  83. orderInfo = [];
  84. splitstr = "@_@";
  85. $("tr[class=head] a[track=orderinfopagebeta]").each(function(index){
  86.   orderid = $(this).text();
  87.   //console.log("---------orderid-------" + orderid);
  88.   mycomment = $("a[id=comment_" + orderid + "]").attr('style').replace(/[\r\n]\ +/g,"");
  89.   if("display: block;" == mycomment){
  90.     mycomment = '已评价';
  91.   }else if('display:none;' == mycomment){
  92.     mycomment = '未评价';
  93.   }
  94.  
  95.   tempshopid = $("img[id=remarkFlag_" + orderid + "]").attr('onclick');
  96.   shopidIndex = tempshopid.indexOf(",");
  97.   shopid = tempshopid.substr(shopidIndex + 1).replace(/[\)\;]/g,"");
  98.   //console.log("---------shopid-------" + shopid);
  99.   orderdesc = shopid + splitstr + orderid + splitstr + mycomment + splitstr + payMoney[index] + splitstr + orderTime[index] + splitstr + paytype[index] + splitstr + yunfei[index] + splitstr + orderStatus[index] + splitstr + users[index] + splitstr + remark[index] + splitstr + express[index];
  100.   console.log("---------orderdesc-------" + orderdesc);
  101.   orderInfo.push(orderdesc);
  102. });
  103.  
  104. //chrome.extension.sendMessage({"orderInfo": orderInfo}, function(response) {});
  105. page = parseInt($("a[class=current]").text());
  106. totalPage = parseInt($("input[name=totalPage]").val());
  107. console.log(page + "--page-----------totalPage---" + totalPage);
  108. if(page < totalPage && page < 100){
  109.   console.log("---------next-------");
  110.   sendMsg( orderInfo, "next" );
  111.   $('a.next')[1].click();
  112. }else{
  113.   console.log("---------end-------");
  114.   sendMsg( orderInfo, "end" );
  115. }
  116. //
  117.  
  118. }
  119.  
  120. //将获取内容传递给后台文件进行处理
  121. function sendMsg( msg, cmd){
  122.   chrome.extension.sendMessage({"msg": msg, "cmd": cmd}, function(response) {});
  123. }

5、创建后台处理js文件eventPage.js

  1. var flag = false;
  2. var currentTabId;
  3. chrome.browserAction.onClicked.addListener(function(tab) {
  4.   counter = 40;
  5.   console.log('Turning ' + tab.url);
  6.   flag = true;
  7.   currentTabId = tab.id;
  8.   chrome.tabs.getSelected(null, function(tab) {
  9.     sendMsg(tab.id);
  10.   });
  11. });
  12.  
  13. chrome.webNavigation.onCompleted.addListener(function( tab ){
  14.   console.log('加载完成***' + tab.tabId );
  15.   if( flag ){
  16.     sendMsg( tab.tabId );
  17.   }
  18. });
  19.  
  20. chrome.extension.onMessage.addListener(
  21.  
  22. function(request, sender, sendResponse) {
  23.   console.log("*******evenPage.js***chrome.extension.onMessage.addListener");
  24.   articleData = request;
  25.   $.ajax({
  26.     url: "服务器接受数据URL/getOrderinfo.php",
  27.     cache: false,
  28.     type: "POST",
  29.     data: {'orderinfo': request.msg.join("#$#")},
  30.     dataType: "json"
  31.     }).done(function(msg) {
  32.       console.log('*******************json*************' + msg.sql );
  33.       chrome.tabs.sendMessage(currentTabId, {"cmd":"end"},
  34.       function(response) {
  35.       console.log(response);
  36.  });
  37.  
  38. }).fail(function(jqXHR, textStatus) {
  39.   articleData.firstAccess = textStatus;
  40. });
  41.  
  42. cmd = request.cmd;
  43. if('end' == cmd){
  44.   flag = false;//确保不会自动运行
  45. }
  46.  
  47. });
  48.  
  49. function sendSku2Info(colores){
  50.   chrome.tabs.query(
  51.     {active: true, currentWindow: true}, function(tabs) {
  52.       chrome.tabs.sendMessage(tabs[0].id, {"cmd":"ok", "sku": colores},
  53.       function(response) {
  54.         console.log(response);
  55.       });
  56.  
  57.   });
  58. }
  59.  
  60. function sendMsg( tabid ){
  61.   console.log(tabid + "--sendMsg()----eventPage.js");
  62.   chrome.tabs.sendMessage(tabid, {greeting: "start working"}, function(response) {
  63.   });
  64. }

4、创建服务器接收文件getOrderInfo.php(放在服务器哦,亲!)

  1. <?php
  2.  
  3. header("Content-type:text/html; charset=utf-8");
  4. //include("./includes/global.php");
  5. echo "***********************";
  6. $con = mysql_connect("localhost","root","root");
  7. echo "==============";
  8. if (!$con)
  9. {
  10.   die('Could not connect: ' . mysql_error());
  11. }
  12. mysql_select_db("test", $con);
  13. //var_dump($_REQUEST);
  14. $orderinfo = $_POST['orderinfo'];
  15. $orderArr = explode('#$#', $orderinfo);
  16. print_r($orderArr);
  17. $sql_value = array();
  18. $split = "', '";
  19. foreach($orderArr as $myorder){
  20.   $value = explode('@_@', $myorder);
  21.   echo "===========" . $value[10] ."</br>";
  22.   $sql = "INSERT INTO test(venderId, orderid, pingjia, money, ordertime, paytype, yunfei, orderstatu, user, remark, express) VALUES ";
  23.   $sql .= "('" . $value[0] . $split . $value[1] . $split . $value[2] . $split . $value[3] . $split . $value[4] . $split . $value[5] . $split . $value[6] . $split .     $value[7] . $split . $value[8] . $split . $value[9] . $split . $value[10] . "') ON DUPLICATE KEY UPDATE remark = '" . $value[9] . "', pingjia = '" .     $value[2] . "', orderstatu = '" . $value[7] . "', express = '" . $value[10] . "'";
  24.   mysql_query($sql);
  25. }
  26. mysql_close($con);
  27.  
  28. ?>

5、创建数据库表

  1. CREATE TABLE `test` (
  2. `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
  3. `venderId` int(10) NOT NULL DEFAULT '' COMMENT '商家ID',
  4. `orderid` bigint(20) NOT NULL DEFAULT '' COMMENT '订单ID',
  5. `pingjia` varchar(100) NOT NULL DEFAULT '' COMMENT '订单发出后的状态(是否评价)',
  6. `money` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '订单金额',
  7. `ordertime` varchar(100) NOT NULL DEFAULT '' COMMENT '下单时间',
  8. `paytype` varchar(100) NOT NULL DEFAULT '' COMMENT '付款方式',
  9. `yunfei` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '运费',
  10. `orderstatu` varchar(100) NOT NULL DEFAULT '' COMMENT '订单状态',
  11. `user` varchar(255) NOT NULL DEFAULT '' COMMENT '订单用户',
  12. `remark` varchar(255) NOT NULL DEFAULT '' COMMENT '备注',
  13. `express` varchar(255) NOT NULL DEFAULT '' COMMENT '物流方式和运单号',
  14. `shop_id` int(10) unsigned NOT NULL DEFAULT '' COMMENT '店铺表ID',
  15. `shop_name` varchar(255) NOT NULL DEFAULT '' COMMENT '店铺名称',
  16. `stattime` int(11) NOT NULL DEFAULT '' COMMENT '下单年月日',
  17. PRIMARY KEY (`id`),
  18. UNIQUE KEY `orderid` (`orderid`)
  19. ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT=''

注意:各文件中红色部分需要手工修改,此外如果修改js文件名,请在manifest.json中修改相应的配置信息即可。

插件加载步骤:

  

示例代码:https://github.com/jackgitgz/chrome_server_plugin

此示例仅供参考,有理解不到位或错误的还请指出。

利用chrome插件批量读取浏览器页面内容并写入数据库的更多相关文章

  1. 利用Chrome插件向指定页面植入js,劫持 XSS

    资源来自:http://www.2cto.com/Article/201307/225986.html 首页 > 安全 > 网站安全 > 正文 利用Chrome插件向指定页面植入js ...

  2. 利用Chrome的Performance工具排查页面性能问题(原叫timeline)

    当页面中发生卡顿,最先考虑的是swf文件造成的卡顿,经过排查发现不是swf造成的影响,利用Chrome的Performance工具发现页面中的一些元素不断在重新布局,造成潜在的性能瓶颈. 首先在Chr ...

  3. 利用webBrowser获取框架内Html页面内容

    原文:利用webBrowser获取框架内Html页面内容 利用webBrowser获取页面比较简单,MSDN下有示例,在这里不必多说. 可是一些 HTML 文档由“框架”构成,或可以存放它们自己独特 ...

  4. 将RichTextBox的内容直接写入数据库:

    将RichTextBox的内容直接写入数据库: private void button1_Click(object sender, EventArgs e) {    System.IO.Memory ...

  5. java批量读取多个文件并存入数据库

    有时候服务运行的日志文件,需要统计分析,但数据量很大,并且直接在文件中看很不直观,这时可以将文件中的内容导入到数据库,入库后的数据就可以按照需求进行统计分析了. 这个是以服务器的访问日志作为示例,一个 ...

  6. jxl读取excel实现导入excel写入数据库

    @RequestMapping(params = "method=import", method = RequestMethod.POST) @ResponseBody publi ...

  7. 利用chrome console批量下载文件

    因工作需要,需要定期从某页面下载多个文档,是体力活. 想用chrome扩展,找了几个不行.原因是: 1.有的扩展识别不了链接,因为链接是形如:jsp?XXX=XXX的形式 2.有的扩展能批量打开链接, ...

  8. c# 读取 excel文件内容,写入txt文档

    1 winform 读取excel文档 1)点击button按钮,弹出上传excel窗口 private void button_headcompany_Click(object sender, Ev ...

  9. Yii 读取CVS文件内容插入到数据库

    这个方法和上次写的读取txt文件的方法基本上差不多,直接贴代码,需要的直接拿走 function ImportExcel(){ $file = fopen('test.csv','r'); //输出文 ...

随机推荐

  1. MySQL性能优化

    当今数据库的操作越来越成为整个应用的性能瓶颈,特别是Web应用更加明显.当我们设计数据库和对数据库操作时,都要考虑到性能. 1.优化查询语句,方便查询缓存 大多数MySQL服务器都开启了查询缓存,这是 ...

  2. How to Disable Strict SQL Mode in MySQL 5.7

    If your app was written for older versions of MySQL and is not compatible with strict SQL mode in My ...

  3. 以.net core重构原有.net framework过程中的一些API变更记录(持续更新)

    1)Type.IsGenericType类似属性变更 以下是.net framework 4.5中Type抽象类中泛型类型的几个个属性,用于泛型类型的相关信息判断: 以下是.net core(nets ...

  4. Android App的设计架构:MVC,MVP,MVVM与架构经验谈

    相关:http://www.cnblogs.com/wytiger/p/5996876.html 和MVC框架模式一样,Model模型处理数据代码不变在Android的App开发中,很多人经常会头疼于 ...

  5. matlab中pcolorh函数作用

    就是说X,Y是用来定位的,C是用来填充颜色的.参数C要求至少是一个矩阵,而参数X,Y可以是向量,也可以是矩阵.当X,Y是向量时,X与C的行对应,Y与C的列对应,因此向量X与Y的维数必须要求与C的行与列 ...

  6. 纪念BLives 1.0版本发布

    历时两个多月的时间,BLives程序1.0发布,在开发程序期间自己经历了很多,考试,恋爱,学业,自己很纠结 很伤心,有时候很无助,为了让自己有事干,我在考试备考期间去设计程序- -#,虽然程序设计的一 ...

  7. oracle--函数--bai

    --1 没有入参的函数.返回字符串 create or replace function get_time return varchar2 as v_time varchar2(20); --声明1个 ...

  8. c# 动态调用WCF方法笔记!

    //动态调用wcf方法 string url = "http://localhost:54379/ServiceWCF.svc"; IDoubleService proxy = W ...

  9. 安装PHP sphinx扩展 sphinx-1.1.0/sphinx.c:105:2: error: too few arguments 错误

    表现: /home/sphinx-1.1.0/sphinx.c: In function 'php_sphinx_client_read_property':/home/sphinx-1.1.0/sp ...

  10. Manage Metadata Service Error: There are no addresses available for this application

    打开正常创建的Metadata Service后发现了如下的错误: 检查了Application Pool和Managed Metadata Web  Service ,发现两者一切正常,之后查看Sh ...