简介:没用过爬虫,现在有门课正好需要我们去学,于是试了下。想从实践入手,因此,给自己提了个需求:『把微信公众号的授权管理页面的开白名单抓出来』。并没有什么难度,这是我第一次独立写 JavaScript 脚本(以前都是照着教程写小儿科…),道理和 python 是差不多的,我录了视频,对每个步骤、分析过程、基本的道理进行讲解。文末是全部代码。

文章目录

  • 视频
  • 以下是视频思路与代码
    • 问题分析
    • 为什么暂时不用 python
    • 代码
  • 欢迎给我提建议

视频

「自学心得」入门爬虫,先抛开python,从手边的『浏览器』开始玩起!

以下是视频思路与代码

问题分析

这个问题的数据量非常“微小”,我只是想把网页上的东西提取出来而已(取代人的手动复制粘贴)。

我们知道,我们的浏览器之所以能显示网页,原理可以简单理解为:

  • 第一步,我们本地的设备给网站发请求
  • 第二步,网站验证了我们的权限,给我们发信息(以.html .css .js文件的形式)
  • 第三步,我们本地设备的浏览器,理解这些代码,并且根据这些代码的指令,绘制出图片,就是我们看到的“网页”

这也就是为什么我跟我的课程上的:我们能看到的东西,我们一定能爬下来。

因为我们看到的内容,一定都是由 下载到本地的代码 编译出来的。本地的东西,还不许我随便用吗?

为什么暂时不用 python

第一次做爬虫,我没有选择用 python ,因为我发现我这个项目里, python 有点“舍近求远”,体现不出自己的优势。

如上,如果使用 python ,则会在 第二步,网站验证了我们的权限,给我们发信息 这一步有些吃力。

我们需要使用 python 模拟登陆,否则,网站不会认为我们有权限,也就不会把账号里的信息发过来。

那么,何不直接在浏览器中直接进行处理呢?

  • 浏览器可以直接“看得懂”的语言是 javascript
  • 视频中,我将演示,如何用浏览器快速得定位元素、发现规律,在代码中获取

代码

function get_name_and_account(number=1) {number = number.toString()let name_url_1 = "#app > div.weui-desktop-layout__main__bd > div > div.s_table_wrp.whitelist_table > div.s_table > ul.s_tbody > li:nth-child("let name_url_2 = ") > div > div.s_cell.biz_info.tl > div > span > div > div.info > h4"let account_url_1 = "#app > div.weui-desktop-layout__main__bd > div > div.s_table_wrp.whitelist_table > div.s_table > ul.s_tbody > li:nth-child("let account_url_2 = ") > div > div.s_cell.biz_info.tl > div > div > div > div > div > div > p:nth-child(3) > span"// 把字符串拼接起来,然后根据这个字符串 selector 信息获取元素let name = document.querySelector(name_url_1 + number + name_url_2)let account = document.querySelector(account_url_1 + number + account_url_2)// 获取元素后,用 .textContent 属性提取文本return {"name": name.textContent, "account": account.textContent}
}// get_name_and_account(10);function get_this_page() {let this_page_list = []for (let i=1; i<=10; i++) {try {// 这里我做了一个 try {} catch {}// 考虑到最后一页的元素个数可能小于 10// 因此如果去 get_name_and_account(10)// 会报错;因此,使用 try 把错误抓住// 并让程序继续进行下去,而不是因为错误退出let obj = get_name_and_account(i)this_page_list.push(obj)} catch(e) {console.log(e);return this_page_list;}}return this_page_list;
}function next_page() {let total_page_num = document.querySelector("#app > div.weui-desktop-layout__main__bd > div > div.pagination_wrp > div > span.weui-desktop-pagination__nav > span > label:nth-child(3)")let this_page_num = document.querySelector("#app > div.weui-desktop-layout__main__bd > div > div.pagination_wrp > div > span.weui-desktop-pagination__nav > span > label:nth-child(1)")// 把字符串转换为十进制数值total_page_num = parseInt(total_page_num.textContent, 10)this_page_num = parseInt(this_page_num.textContent, 10)// 这里是在判断:是不是到了最后一页了?// 到了,则不翻页,返回 false ;// 否则,执行之后的翻页逻辑if (this_page_num == total_page_num) {return false;}// 获取 button 元素button = document.querySelector("#app > div.weui-desktop-layout__main__bd > div > div.pagination_wrp > div > span.weui-desktop-pagination__nav > a")// 并调用 click() 方法button.click();// 上述代码并不是总起作用// 因此可以考虑进行改进:// 不用 selector 获取,而是获取 button 类,然后进行条件判断// 有大佬有更好的方法,欢迎告诉我:piperliu@qq.comreturn true;
}function popupCenter(text, title=null, w=800, h=screen.height) {w = w > screen.availWidth? screen.availWidth : w;h = h > screen.availHeight ? screen.availHeight : h;var x = screen.availWidth / 2 - w / 2;var y = screen.availHeight / 2 - h / 2;x = x < 0 ? 0 : x;y = y < 0 ? 0 : y;var win;try {win = window.open('', title, 'scrollbars=yes, width=' + w + ', height=' + h + ', top=' + y + ', left=' + x);win.opener = null;} catch (e) {win = window.open('', title, 'scrollbars=yes, width=' + w + ', height=' + h + ', top=' + y + ', left=' + x);log(e);}if (window.focus) {win.focus();}// 下面事加入一段文本let a = win.document.createElement('a')// 为列表换行,正则表达式全局匹配用 gtext = text.replace(/\},/g, "}\n")text = text + "\n"a.innerText = textwin.document.body.appendChild(a)return win;}function easy() {let this_page_list = get_this_page();s = JSON.stringify(this_page_list).slice(1, -1);console.log(s)popupCenter(s)
//     next_page();
}// 运行一次脚本
// 就是调用一次 easy()
// 就会获取本页开白账号列表
easy()function main() {var total_page_list = []do {let this_page_list = get_this_page();total_page_list.concat(this_page_list);} while (next_page());console.log(total_page_list)return total_page_list;
}// test 函数只是用于局部测试
// 没有实际功能
function test() {
//     let test_obj_1 = get_name_and_account(1)
//     console.log(test_obj_1)//     let test_obj_2 = get_this_page()
//     console.log(test_obj_2)//     let test_obj_3 = next_page();
}// test();// main();

欢迎给我提建议

最后,这是我第一次用 js 解决问题,欢迎加我微信 PiperLHJ ,加入交流群;或者 piperliu@qq.com 给我提批评建议。

「爬虫入门」拒绝跟热点搞python,直接在浏览器里体验『第一次』,理解原理=>如鱼得水相关推荐

  1. 「SAP技术」SAP 如何看序列号被包在哪些HU里?

    「SAP技术」SAP 如何看序列号被包在哪些HU里? 事务代码SE16 ,表名OBJK, 输入物料号,序列号,HeadTable 输入值SER06, 查询结果如下, 根据objlist, 去表ser0 ...

  2. 【Python爬虫脚本】拒绝黄牛从我做起!Python自动抢购脚本,准点原价秒杀飞天茅台!!!

    前言 点击下方视频即可查看详细教程 [Python爬虫脚本]拒绝黄牛从我做起!Python自动抢购脚本,准点原价秒杀飞天茅台!!! 源码领取 上述这份完整版的源码课件已经上传CSDN官方,朋友们如果需 ...

  3. 「爬虫教程」吐血整理,最详细的爬虫入门教程

    初识爬虫 学习爬虫之前,我们首先得了解什么是爬虫.来自于百度百科的解释: 网络爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息 ...

  4. Python爬虫入门教程:超级简单的Python爬虫教程

    这是一篇详细介绍 [Python]爬虫入门的教程,从实战出发,适合初学者.读者只需在阅读过程紧跟文章思路,理清相应的实现代码,30 分钟即可学会编写简单的 Python 爬虫. 这篇 Python 爬 ...

  5. python爬虫入门教程pdf-从零开始学Python网络爬虫 PDF 原书扫描版

    给大家带来的一篇关于Python爬虫相关的电子书资源,介绍了关于Python.网络爬虫方面的内容,本书是由机械工业出版社出版,格式为PDF,资源大小143.9 MB,罗攀编写,目前豆瓣.亚马逊.当当. ...

  6. 给国企定制小程序,这家「云服务商」 1 个月搞定

    知晓云 高效.稳定的知晓云云服务 + 企业定制化服务,已成为各行业上云的首选. 近期,知晓云帮助国企单位党支部顺利上线「智慧政企党建小程序」,为内部员工提供一个集「宣传.管理.教育.服务.沟通.考核」 ...

  7. ise 时钟约束_「新手入门」ISE工程升级到Vivado及板级信号调试技术

    由于疫情,大家最近都只能在家中进行学习.同时实验室的研一同学也在通过Teamviewer进行培训项目的实际操作.这次把两位同学的研究成果给大家分享一下,老司机们可以重温一下当年自己新手时的情景,新司机 ...

  8. 「数据分析入门」某线下连锁水果店销售数据分析

    所有人刚接触到数据分析岗位的时候,大家都在告诉他,数据分析师要有分析思维,懂业务流程balabala-直接给新人劝退,相信大多数的小白跟我当初一样,面对这个问题,我内心是无比的excuse me??? ...

  9. 「Flask入门」让它跑起来

    在 Ubuntu 20.04 上安装 Flask,首先要检查系统是否安装了 python3, python3 -V 对应输出为, Python 3.8.5 则为正常,接着安装 python 的虚拟环境 ...

最新文章

  1. 如何构建顶部导航条_如何构建导航栏
  2. plotly可视化绘制共享坐标轴图
  3. 1249. 移除无效的括号
  4. mysql游标表间数据迁移_FalseMySQL存储过程--gt;通过游标遍历和异常处理迁移数据到历史表-mysql-第二电脑网...
  5. C语言核心技术-C语言概述与开发环境搭建
  6. matlab里vpa怎么用_“学校里的师兄师姐,用英文怎么说?”
  7. 报错A Database Error Occurred,linux系统被cc***
  8. sqlplus 登陆报协议适配器错误
  9. Prolog 语言入门(一)
  10. 审计 6 SSRF和任意文件读取
  11. [回帖整理] 创业难
  12. Anaconda 最新版本的下载和安装
  13. 怎么两边同时取ln_回归分析为什么要取LN值
  14. 一篇基金研报--《外包服务:后安迪-比尔时代IT产业的大餐》
  15. Unity学习Day14--协程和WWW
  16. python计算单词长度_python – 返回字符串中的单词长度
  17. VUE解决warning(Emitted value instead of an instance of Error) el-table-column v-for=item in batch问题
  18. 71.JAVA编程思想——JAVA与CGI
  19. Idea如何配置svn或集成svn。
  20. EE4408: Machine Learning:

热门文章

  1. NPOI 设置合并后的单元格的边框的解决方法
  2. 树莓派VI命令大全(附vim使用异常,卸载重新安装步骤)
  3. 在maven项目中解决第三方jar包依赖的问题
  4. 如何基于列值从DataFrame中选择行?
  5. 如何使用print()打印类的实例?
  6. 在输入文本框中获取值
  7. 如何让jQuery执行同步而不是异步的Ajax请求?
  8. 电脑系统怎么卸载驱动程序
  9. c++new时赋初值_C++ Lesson 7:new,delete amp; 类的重用
  10. IoT:大端与小端字节数据详解