利用chrome插件批量读取浏览器页面内容并写入数据库
试想一下,如果每天要收集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
- <html><head>
- </head></html>
3、创建配置文件manifest.json文件
- {
- "name": "获取某电商后台订单信息",
- "version": "1.0",
- "manifest_version": 2,
- "description": "*********获取某电商后台订单信息*********",
- "browser_action": {
- "default_icon": "icon.png"
- },
- "permissions": [
- "webNavigation",
- "tabs",
- "contextMenus",
- "http://服务器接受数据url/"
- ],
- "background": {
- "scripts": ["eventPage.js","jquery-2.1.1.min.js"]
- },
- "content_scripts": [
- {
- "matches": ["http://抓取页面url/*"],
- "js": ["jquery-2.1.1.min.js", "contentscript.js"]
- }
- ]
- }
4、创建前端js文件contentscript.js
- var totalPage;
- var page = 0;
- //注册前台页面监听事件
- chrome.extension.onMessage.addListener(
- function(request, sender, sendResponse) {
- totalPage = $("input[name=totalPage]").val();
- console.log("totalPage----------" + totalPage);
- //console.log("msg----------contentscript.js" + request.greeting);
- getOrderInfo( sendResponse );
- });
- //获取订单信息
- function getOrderInfo( sendResponse ){
- var flag = false;
- payMoney = [];//货款金额
- orderTime = [];//下单时间
- $("tr[class=head] span").each(function(index){
- spantxt = '';
- spantxt = $(this).text();
- if(spantxt.indexOf('货款金额:') > -1){
- money = spantxt.substr(5);
- //console.log(index + "---------payMoney-------货款金额:" + money);
- payMoney.push(money);
- }else if(spantxt.indexOf('下单时间:') > -1){
- time = spantxt.substr(5);
- //console.log(index + "---------orderTime-------下单时间:" + time);
- orderTime.push(time);
- }
- });
- paytype = [];//物流方式
- yunfei = [];//运费
- $("td[class=p-values]").each(function(index){
- tdtxt = '';
- tdtxt = $(this).text();
- if(tdtxt.indexOf('货到付款') > -1){
- paytype.push('货到付款');
- }else{
- paytype.push('在线支付');
- }
- yf_index = tdtxt.indexOf('运费:');
- if(yf_index > -1){
- temp = tdtxt.substr(yf_index);
- temp_yf = temp.substr(3);
- //console.log(index + "---------yunfei-------"+ temp +"===" + temp_yf);
- yunfei.push(temp_yf);
- }else{
- yunfei.push(0);
- }
- //console.log(index + "---------tdtxt-------" + tdtxt);
- });
- orderStatus = [];//订单状态
- users = [];//买家账号
- remark = [];//备注
- $("tr[class=content] td[class=t-c]").each(function(index){
- tdtxt = '';
- tdtxt = $(this).text().replace(/[\r\n]\ +/g,"");//将回车,换行,空格去掉
- temp = index % 5;
- if(1 == temp){
- orderStatus.push(tdtxt);
- //console.log(index + "---------statu-------" + tdtxt);
- }else if(2 == temp){
- users.push(tdtxt);
- //console.log(index + "---------users-------" + tdtxt);
- }else if(3 == temp){
- remark.push(tdtxt);
- //console.log(index + "---------remark-------" + tdtxt);
- }
- });
- express = [];//快递单号
- $("tr[class=content] td div[style='text-align: center;']").each(function(index){
- tdtxt = '';
- tdtxt = $(this).text().replace(/[\r\n]\ +/g,"");//将回车,换行,空格去掉
- express.push(tdtxt);
- //console.log( "============快递单号=======" + tdtxt);
- });
- orderInfo = [];
- splitstr = "@_@";
- $("tr[class=head] a[track=orderinfopagebeta]").each(function(index){
- orderid = $(this).text();
- //console.log("---------orderid-------" + orderid);
- mycomment = $("a[id=comment_" + orderid + "]").attr('style').replace(/[\r\n]\ +/g,"");
- if("display: block;" == mycomment){
- mycomment = '已评价';
- }else if('display:none;' == mycomment){
- mycomment = '未评价';
- }
- tempshopid = $("img[id=remarkFlag_" + orderid + "]").attr('onclick');
- shopidIndex = tempshopid.indexOf(",");
- shopid = tempshopid.substr(shopidIndex + 1).replace(/[\)\;]/g,"");
- //console.log("---------shopid-------" + shopid);
- 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];
- console.log("---------orderdesc-------" + orderdesc);
- orderInfo.push(orderdesc);
- });
- //chrome.extension.sendMessage({"orderInfo": orderInfo}, function(response) {});
- page = parseInt($("a[class=current]").text());
- totalPage = parseInt($("input[name=totalPage]").val());
- console.log(page + "--page-----------totalPage---" + totalPage);
- if(page < totalPage && page < 100){
- console.log("---------next-------");
- sendMsg( orderInfo, "next" );
- $('a.next')[1].click();
- }else{
- console.log("---------end-------");
- sendMsg( orderInfo, "end" );
- }
- //
- }
- //将获取内容传递给后台文件进行处理
- function sendMsg( msg, cmd){
- chrome.extension.sendMessage({"msg": msg, "cmd": cmd}, function(response) {});
- }
5、创建后台处理js文件eventPage.js
- var flag = false;
- var currentTabId;
- chrome.browserAction.onClicked.addListener(function(tab) {
- counter = 40;
- console.log('Turning ' + tab.url);
- flag = true;
- currentTabId = tab.id;
- chrome.tabs.getSelected(null, function(tab) {
- sendMsg(tab.id);
- });
- });
- chrome.webNavigation.onCompleted.addListener(function( tab ){
- console.log('加载完成***' + tab.tabId );
- if( flag ){
- sendMsg( tab.tabId );
- }
- });
- chrome.extension.onMessage.addListener(
- function(request, sender, sendResponse) {
- console.log("*******evenPage.js***chrome.extension.onMessage.addListener");
- articleData = request;
- $.ajax({
- url: "服务器接受数据URL/getOrderinfo.php",
- cache: false,
- type: "POST",
- data: {'orderinfo': request.msg.join("#$#")},
- dataType: "json"
- }).done(function(msg) {
- console.log('*******************json*************' + msg.sql );
- chrome.tabs.sendMessage(currentTabId, {"cmd":"end"},
- function(response) {
- console.log(response);
- });
- }).fail(function(jqXHR, textStatus) {
- articleData.firstAccess = textStatus;
- });
- cmd = request.cmd;
- if('end' == cmd){
- flag = false;//确保不会自动运行
- }
- });
- function sendSku2Info(colores){
- chrome.tabs.query(
- {active: true, currentWindow: true}, function(tabs) {
- chrome.tabs.sendMessage(tabs[0].id, {"cmd":"ok", "sku": colores},
- function(response) {
- console.log(response);
- });
- });
- }
- function sendMsg( tabid ){
- console.log(tabid + "--sendMsg()----eventPage.js");
- chrome.tabs.sendMessage(tabid, {greeting: "start working"}, function(response) {
- });
- }
4、创建服务器接收文件getOrderInfo.php(放在服务器哦,亲!)
- <?php
- header("Content-type:text/html; charset=utf-8");
- //include("./includes/global.php");
- echo "***********************";
- $con = mysql_connect("localhost","root","root");
- echo "==============";
- if (!$con)
- {
- die('Could not connect: ' . mysql_error());
- }
- mysql_select_db("test", $con);
- //var_dump($_REQUEST);
- $orderinfo = $_POST['orderinfo'];
- $orderArr = explode('#$#', $orderinfo);
- print_r($orderArr);
- $sql_value = array();
- $split = "', '";
- foreach($orderArr as $myorder){
- $value = explode('@_@', $myorder);
- echo "===========" . $value[10] ."</br>";
- $sql = "INSERT INTO test(venderId, orderid, pingjia, money, ordertime, paytype, yunfei, orderstatu, user, remark, express) VALUES ";
- $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] . "'";
- mysql_query($sql);
- }
- mysql_close($con);
- ?>
5、创建数据库表
- CREATE TABLE `test` (
- `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
- `venderId` int(10) NOT NULL DEFAULT '' COMMENT '商家ID',
- `orderid` bigint(20) NOT NULL DEFAULT '' COMMENT '订单ID',
- `pingjia` varchar(100) NOT NULL DEFAULT '' COMMENT '订单发出后的状态(是否评价)',
- `money` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '订单金额',
- `ordertime` varchar(100) NOT NULL DEFAULT '' COMMENT '下单时间',
- `paytype` varchar(100) NOT NULL DEFAULT '' COMMENT '付款方式',
- `yunfei` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '运费',
- `orderstatu` varchar(100) NOT NULL DEFAULT '' COMMENT '订单状态',
- `user` varchar(255) NOT NULL DEFAULT '' COMMENT '订单用户',
- `remark` varchar(255) NOT NULL DEFAULT '' COMMENT '备注',
- `express` varchar(255) NOT NULL DEFAULT '' COMMENT '物流方式和运单号',
- `shop_id` int(10) unsigned NOT NULL DEFAULT '' COMMENT '店铺表ID',
- `shop_name` varchar(255) NOT NULL DEFAULT '' COMMENT '店铺名称',
- `stattime` int(11) NOT NULL DEFAULT '' COMMENT '下单年月日',
- PRIMARY KEY (`id`),
- UNIQUE KEY `orderid` (`orderid`)
- ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT=''
注意:各文件中红色部分需要手工修改,此外如果修改js文件名,请在manifest.json中修改相应的配置信息即可。
插件加载步骤:
示例代码:https://github.com/jackgitgz/chrome_server_plugin
此示例仅供参考,有理解不到位或错误的还请指出。
利用chrome插件批量读取浏览器页面内容并写入数据库的更多相关文章
- 利用Chrome插件向指定页面植入js,劫持 XSS
资源来自:http://www.2cto.com/Article/201307/225986.html 首页 > 安全 > 网站安全 > 正文 利用Chrome插件向指定页面植入js ...
- 利用Chrome的Performance工具排查页面性能问题(原叫timeline)
当页面中发生卡顿,最先考虑的是swf文件造成的卡顿,经过排查发现不是swf造成的影响,利用Chrome的Performance工具发现页面中的一些元素不断在重新布局,造成潜在的性能瓶颈. 首先在Chr ...
- 利用webBrowser获取框架内Html页面内容
原文:利用webBrowser获取框架内Html页面内容 利用webBrowser获取页面比较简单,MSDN下有示例,在这里不必多说. 可是一些 HTML 文档由“框架”构成,或可以存放它们自己独特 ...
- 将RichTextBox的内容直接写入数据库:
将RichTextBox的内容直接写入数据库: private void button1_Click(object sender, EventArgs e) { System.IO.Memory ...
- java批量读取多个文件并存入数据库
有时候服务运行的日志文件,需要统计分析,但数据量很大,并且直接在文件中看很不直观,这时可以将文件中的内容导入到数据库,入库后的数据就可以按照需求进行统计分析了. 这个是以服务器的访问日志作为示例,一个 ...
- jxl读取excel实现导入excel写入数据库
@RequestMapping(params = "method=import", method = RequestMethod.POST) @ResponseBody publi ...
- 利用chrome console批量下载文件
因工作需要,需要定期从某页面下载多个文档,是体力活. 想用chrome扩展,找了几个不行.原因是: 1.有的扩展识别不了链接,因为链接是形如:jsp?XXX=XXX的形式 2.有的扩展能批量打开链接, ...
- c# 读取 excel文件内容,写入txt文档
1 winform 读取excel文档 1)点击button按钮,弹出上传excel窗口 private void button_headcompany_Click(object sender, Ev ...
- Yii 读取CVS文件内容插入到数据库
这个方法和上次写的读取txt文件的方法基本上差不多,直接贴代码,需要的直接拿走 function ImportExcel(){ $file = fopen('test.csv','r'); //输出文 ...
随机推荐
- MySQL性能优化
当今数据库的操作越来越成为整个应用的性能瓶颈,特别是Web应用更加明显.当我们设计数据库和对数据库操作时,都要考虑到性能. 1.优化查询语句,方便查询缓存 大多数MySQL服务器都开启了查询缓存,这是 ...
- 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 ...
- 以.net core重构原有.net framework过程中的一些API变更记录(持续更新)
1)Type.IsGenericType类似属性变更 以下是.net framework 4.5中Type抽象类中泛型类型的几个个属性,用于泛型类型的相关信息判断: 以下是.net core(nets ...
- Android App的设计架构:MVC,MVP,MVVM与架构经验谈
相关:http://www.cnblogs.com/wytiger/p/5996876.html 和MVC框架模式一样,Model模型处理数据代码不变在Android的App开发中,很多人经常会头疼于 ...
- matlab中pcolorh函数作用
就是说X,Y是用来定位的,C是用来填充颜色的.参数C要求至少是一个矩阵,而参数X,Y可以是向量,也可以是矩阵.当X,Y是向量时,X与C的行对应,Y与C的列对应,因此向量X与Y的维数必须要求与C的行与列 ...
- 纪念BLives 1.0版本发布
历时两个多月的时间,BLives程序1.0发布,在开发程序期间自己经历了很多,考试,恋爱,学业,自己很纠结 很伤心,有时候很无助,为了让自己有事干,我在考试备考期间去设计程序- -#,虽然程序设计的一 ...
- oracle--函数--bai
--1 没有入参的函数.返回字符串 create or replace function get_time return varchar2 as v_time varchar2(20); --声明1个 ...
- c# 动态调用WCF方法笔记!
//动态调用wcf方法 string url = "http://localhost:54379/ServiceWCF.svc"; IDoubleService proxy = W ...
- 安装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 ...
- Manage Metadata Service Error: There are no addresses available for this application
打开正常创建的Metadata Service后发现了如下的错误: 检查了Application Pool和Managed Metadata Web Service ,发现两者一切正常,之后查看Sh ...