一、JS客户端单页爬虫

1、定位爬取标签

因为该爬虫是要覆盖不同网页,所以不能通过特殊标识来定位标签,只能将所有的a标签爬出来然后对href的内容进行一定的筛选。

//预定列表头
var linklist = [['链接']]
//获取所有的a标签
var links = document.getElementsByTagName('a');
for(var link of links){//筛选出以https://chat.whatsapp.com/为开头的a标签if (link.href.startsWith('https://chat.whatsapp.com/')){//将符合要求的链接添加进列表linklist.push([link.href]);}
}
//使用set对列表元素去重
linklist = [...new Set(linklist)]

2、使用xlsx.js工具包

xlsx.js工具包可以直接在前端通过js将数据保存为excel文件。

(1)动态载入js文件

var myScript= document.createElement("script");
myScript.type = "text/javascript";
//在此处引用了其他网站的xlsx.js包,不安全,不确定会不会失效
myScript.src = 'https://demo.haoji.me/2017/02/08-js-xlsx/js/xlsx.core.min.js';
document.body.appendChild(myScript);

(2)定义工具函数

sheet2blob

function sheet2blob(sheet, sheetName) {sheetName = sheetName || 'sheet1';var workbook = {SheetNames: [sheetName],Sheets: {}};workbook.Sheets[sheetName] = sheet;var wopts = {bookType: 'xlsx', bookSST: false, type: 'binary'};var wbout = XLSX.write(workbook, wopts);var blob = new Blob([s2ab(wbout)], {type:"application/octet-stream"});function s2ab(s) {var buf = new ArrayBuffer(s.length);var view = new Uint8Array(buf);for (var i=0; i!=s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;return buf;}return blob;
}

openDownloadDialog

function openDownloadDialog(url, saveName) {if(typeof url == 'object' && url instanceof Blob){url = URL.createObjectURL(url);}var aLink = document.createElement('a');aLink.href = url;aLink.download = saveName || '';var event;if(window.MouseEvent) event = new MouseEvent('click');else{event = document.createEvent('MouseEvents');event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);}aLink.dispatchEvent(event);
}

(3)保存为excel

保存excel操作的前提是需要xlsx.js工具包已经加载完成,所以保存文件的操作需要在onload函数内使用。

myScript.onload = function (){var sheet = XLSX.utils.aoa_to_sheet(linklist);openDownloadDialog(sheet2blob(sheet), 'grouplink.xlsx');
}

3、完整代码

var myScript= document.createElement("script");
myScript.type = "text/javascript";
myScript.src = 'https://demo.haoji.me/2017/02/08-js-xlsx/js/xlsx.core.min.js';
document.body.appendChild(myScript);
myScript.onload = function (){function sheet2blob(sheet, sheetName) {sheetName = sheetName || 'sheet1';var workbook = {SheetNames: [sheetName],Sheets: {}};workbook.Sheets[sheetName] = sheet;var wopts = {bookType: 'xlsx', bookSST: false, type: 'binary'};var wbout = XLSX.write(workbook, wopts);var blob = new Blob([s2ab(wbout)], {type:"application/octet-stream"});function s2ab(s) {var buf = new ArrayBuffer(s.length);var view = new Uint8Array(buf);for (var i=0; i!=s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;return buf;}return blob;}function openDownloadDialog(url, saveName) {if(typeof url == 'object' && url instanceof Blob){url = URL.createObjectURL(url);}var aLink = document.createElement('a');aLink.href = url;aLink.download = saveName || '';var event;if(window.MouseEvent) event = new MouseEvent('click');else{event = document.createEvent('MouseEvents');event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);}aLink.dispatchEvent(event);}var linklist = [['链接']]var links = document.getElementsByTagName('a');for(var link of links){if (link.href.startsWith('https://chat.whatsapp.com/')){linklist.push([link.href]);}}linklist = [...new Set(linklist)]var sheet = XLSX.utils.aoa_to_sheet(linklist);openDownloadDialog(sheet2blob(sheet), 'grouplink.xlsx');
}

二、Google搜索结果爬虫

服务端爬虫使用了python的scrapy爬虫框架,该框架封装了一些爬虫方法,可以比较方便的完成爬虫工作。

1、创建scrapy项目

在linux上安装scrapy十分容易,但在windows上安装可能会遇到Microsoft Visual C++ 14.0 is required这样的报错,解决办法见Microsoft Visual C++ Build Tools下载/解决Visual C++ 14.0 is required问题。

接下来按照官方教程创建grouplink爬虫项目。

scrapy startproject grouplink
cd grouplink

2、实现Google爬虫

本次爬虫的需求是通过运营给定的一系列关键词从Google的搜索结果的网页中爬取WhatsApp的群链接。这就涉及到两个点,第一是对Google搜索结果网页的爬取,第二是对搜索结果网页中的群链接爬取,最后的结果只需得到群连接。

(1)定义Item

item的作用在我的理解上来说是将爬虫爬取到的数据暂存下来,方便以后使用。

items.py

import scrapy
class GrouplinkItem(scrapy.Item):link = scrapy.Field()

(2)新建grouplinkspider.py文件

在grouplink项目下的spiders文件夹新建grouplinkspider.py,搭建爬虫程序的基础架子。

import scrapy
from scrapy.http import Requestclass GrouplinkspiderSpider(scrapy.Spider):name = 'grouplinkspider'allowed_domains = []start_urls = []def parse(self, response):pass

(2)分析Google搜索结果页,编写对应爬虫

通过对Google搜素结果页源码的分析,发现我们所需要的网页a标签并没有任何特殊性的标识,所以用最粗暴的办法将所有的a标签都爬下来然后对href字段进行过滤。

def parse(self, response):urls = response.xpath('//a/@href')for url in urls:strurl = url.extract()//筛选除链接中包含http且不包含google字段的链接if 'http' in strurl and 'google' not in strurl://使用Request方法执行进一步爬虫yield Request(strurl,callback=self.getGroup)

接下来对系列关键词和搜索结果分页的循环爬取。

新建keywords.py文件。

keywords = []
def getKeyWords(index):return keywords[index]def getKeyWordsCount():return len(keywords)

引入keywords,并依次分页循环爬虫方法。

from .keywords import getKeyWords,getKeyWordsCount
class GrouplinkspiderSpider(scrapy.Spider):name = 'grouplinkspider'allowed_domains = []url = "https://www.google.com/search?q="keywordcount = 0start_urls = [url+getKeyWords(0)+"&start=0"]count = 0//爬取最大页数maxCount = 10def parse(self, response)://在日志文件中打印出爬取的urlself.logger.info('Parse function called on %s', response.url)urls = response.xpath('//a/@href')for url in urls:strurl = url.extract()if 'http' in strurl and 'google' not in strurl:yield Request(strurl,callback=self.getGroup)//当页数小于最大页数时加1,并循环执行爬虫函数if self.count < self.maxCount :self.count += 1yield Request(self.url+getKeyWords(self.keywordcount)+"&start="+str(self.count*10),callback=self.parse)//依次获取keywords,将页数置零,并循环执行爬虫函数elif self.keywordcount < getKeyWordsCount(): self.count = 0self.keywordcount += 1 yield Request(self.url+getKeyWords(self.keywordcount)+"&start=0",callback=self.parse)

最后对搜索结果网页群链接的爬取,由于每个网页的结构都不一样,所以也只能将所有的a标签爬取下来,然后对href进行过滤。

import re
from grouplink.items import GrouplinkItem
def getGroup(self, response):links = response.xpath('//a/@href')for link in links:strlink = link.extract()//过滤出包含https://chat.whatsapp.com/字段的链接if "https://chat.whatsapp.com/" in strlink://使用正则切出有用的链接pattern = re.compile(r"https://chat.whatsapp.com/invite/.{22}|https://chat.whatsapp.com/.{22}")strlinks = pattern.findall(strlink)for substrlink in strlinks://实例化itemitem = GrouplinkItem()item['link'] = substrlinkyield item

3、数据保存

现在我们需要的群链接已经爬取下来,然后只需要保存就行了,由于业务需求暂时只保存成excel文件,接下来会保存到后台数据库中。

pipelines.py

from openpyxl import Workbookclass GrouplinkPipeline(object):def __init__(self):self.wb = Workbook()self.ws = self.wb.activeself.ws.append(['链接'])def process_item(self, item, spider):data = [item['link']]self.ws.append(data)self.wb.save('grouplink.xlsx')return item

setting.py

ITEM_PIPELINES = {'grouplink.pipelines.GrouplinkPipeline': 300,
}

4、(附)对于setting.py的配置

在爬取Google的时候遇到了机器人协议文件的限制,需要在setting文件中关闭机器人协议。

ROBOTSTXT_OBEY = False

对于输出日志的配置。

to_day = datetime.datetime.now()
log_file_path = "log/scrapy_{}_{}_{}.log".format(to_day.year,to_day.month,to_day.day)
LOG_LEVEL = "DEBUG"
LOG_FILE = log_file_path

反爬的一些措施。

//设置访问超时时间
DOWNLOAD_TIMEOUT = 200
//设置访问延时
DOWNLOAD_DELAY = 10
//设置不需要cookie
COOKIES_ENABLED = False

5、(附)简单粗暴的断点续爬

断点续爬是爬虫项目中比较重要的功能,一般的是实现方式是用数据库记录爬虫进度信息,具体实现参见网上的教程。在这个项目中,使用了一种简单粗暴的方式来实现断点续爬,将数据保存在文件中,每次爬虫开始和结束对文件的数据进行操作,具体实现如下。

(1)初始化数据

grouplinkspider.py

def __init__(self):                                  #创建初始化函数with open('./count.json', 'r') as f:             #以只读的方式打开文件fcount = json.load(f)                        #将json格式字符串解析为json类型self.count = fcount['pagecount']             #将页数信息赋值给count变量self.keywordscount = fcount['keywordscount'] #将关键词信息赋值给keywordscount变量

(2)记录数据

items.py

pagecount = scrapy.Field()                            #增加pagecount Item
keywordscount = scrapy.Field()                        #增加keywordscount Item

grouplinkspider.py

def getGroup(self, response):for substrlink in strlinks:item['pagecount'] = self.count                #记录页数信息item['keywordscount'] = self.keywordscount    #记录关键词信息

(3)保存数据

pipenlines.py

def __init__(self):self.pagecount = 0self.keywordscount = 0
def process_item(self, item, spider):self.pagecount = item['pagecount']self.keywordscount = item['keywordscount']
def close_spider(self, spider):count = {'pagecount': self.pagecount,'keywordscount': self.keywordscount}with open(',/count.json', 'w') as f:               #以写的方式打开文件json.dump(coun, f)                             #将数据保存到文件

爬取Whatsapp群链接相关推荐

  1. 爬虫实战-python爬取QQ群好友信息

    自从开始学习爬虫后,总是无法控制那一颗躁动的心.每天总是想要爬点什么,爬过电影.爬过电影影评.爬过图片(美女图).爬过视频链接,从最初的简单解析网页到模拟登陆再到异步加载,现在看到一个网页最先想的就是 ...

  2. Python爬虫使用selenium爬取qq群的成员信息(全自动实现自动登陆)

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: python小爬虫 PS:如有需要Python学习资料的小伙伴可以 ...

  3. 使用Python爬取微信群里的百度云资源

    需求背景: 最近误入一个免费(daoban)资源的分享群(正经脸),群里每天都在刷资源链接.但是大家都知道,百度云的分享链接是很容易被河蟹的,群里除了分享链接外,就是各种抱怨 "怎么又失效了 ...

  4. python生成QQ机器人爬取百度文库链接推送好友并生成词云

    QQ机器人爬取百度文库链接推送好友并生成词云 一.环境准备 二.实现QQ机器人 1.QQ机器人介绍 2.安装方法 3.实现自己的QQ机器人 三.百度文库内容链接爬取推送好友 代码实现: 思路分析 1. ...

  5. python实战-HTML形式爬虫-批量爬取电影下载链接

    文章目录 一.前言 二.思路 1.网站返回内容 2.url分页结构 3.子页面访问形式 4.多种下载链接判断 三.具体代码的实现 四.总结 一.前言   喜欢看片的小伙伴,肯定想打造属于自己的私人影院 ...

  6. 项目三:爬取视频磁力链接

    项目三:爬取视频磁力链接 标签(空格分隔): 爬虫 BeautifulSoup -具体技术实现原理类似项目二 1. 项目任务分析 类似上一个小项目中爬取图片的技术原理,本次小项目尝试对相同网站上的可供 ...

  7. python爬取qq群成员_教你用python爬取自己加入的QQ群成员名单

    本次实验环境: 操作系统:Mac OS 开发语言:python 3.6 IDE:jupyter notebook(建议使用) 浏览器:Chrome(版本75.0.3770.100) 需要用到的库:se ...

  8. 爬取网页图片链接并下载保存

    先把需要爬取的网页链接写到表格中 读取表格信息 import xlrd excel_path = '/Users/yt/Desktop/chaye.xlsx'workbook: xlrd.book.B ...

  9. Python简单爬取电影磁力链接

    Python简单爬取电影磁力链接 网页的链接:http://www.ygdy8.net/html/gndy/dyzz/list_23_2.html 打开你想要的电影:http://www.ygdy8. ...

  10. python 爬取扣扣群成员信息

    爬取扣扣群成员 通过 https://qun.qq.com/member.html 这个网页你可以登录网页版的扣扣群号管理. 这样你就可以通过网页来爬取信息了.涉及到个人隐私,这里就不放图片了. 请看 ...

最新文章

  1. ios 前端时间显示NaN异常解决办法
  2. Glusterfs 分布式存储安装部署
  3. USB协议基础知识笔记
  4. 【HDU - 5963】朋友(博弈,思维,必胜态必败态,找规律)
  5. MySQL innodb_table_stats表不存在的解决方法
  6. 有限自动机与有限状态机
  7. 【转】CentOs中Apache开启rewrite模块详解
  8. CSS 总结我对3D效果的一些误解
  9. HP已决定将webOS开源
  10. 小偷程序原理和简单示例
  11. 黄聪:基于jQuery+JSON的省市区三级地区联动
  12. MSM8937-Kernel 内存分布情况
  13. 项目沟通管理 试题分析
  14. 服务器虚拟化svc,服务器虚拟化与SVC技术在高校灾备中的应用
  15. 重学JS(《JavaScript高级程序设计》笔记) - HTML中的JS
  16. 一个比较土但凑合能用的画心方法
  17. 进制数的转换方法大全
  18. pes2017服务器维护时间,PES2017授权详情与球场数据包发布时间
  19. Berkeley DB
  20. Storm开源一周年

热门文章

  1. 苏宁小店上线咖啡业务,成为国内O2O社区便利店的创领者!
  2. 2022Java学习笔记十二(数组的遍历,数组遍历求和,数组排序,数组随机排名案例,数组猜数字游戏案例,数组求最大值案例,数据遍历求和案例)
  3. 解决C语言运行窗口一闪而过问题
  4. java 请求https post 接口 绕过证书验证
  5. 计算机主板上安装配件的扩展槽主要有哪些,21.主板篇-主板上都有哪些扩展插槽-电脑自学网...
  6. ACM的奇计淫巧_扩栈C++/G++
  7. JPEG 图像压缩原理
  8. 自学是一门手艺_错误报告是一门科学
  9. Linux运维笔记(四)
  10. wdr7660虚拟服务器设置,TP-Link TL-WDR7660无线桥接怎么设置?