GitHub超级火!任意爬取,超全开源爬虫工具箱

文 | 程序员GitHub

最近国内一位开发者在 GitHub 上开源了个集众多数据源于一身的爬虫工具箱——InfoSpider,一不小心就火了!!!

有多火呢?开源没几天就登上GitHub周榜第四,标星1.3K,累计分支 172 个。同时作者已经开源了所有的项目代码及使用文档,并且在B站上还有使用视频讲解。

项目代码: 

https://github.com/kangvcar/InfoSpider 

项目使用文档:

https://infospider.vercel.app 

项目视频演示:

https://www.bilibili.com/video/BV14f4y1R7oF/

在这样一个信息爆炸的时代,每个人都有很多个账号,账号一多就会出现这么一个情况:个人数据分散在各种各样的公司之间,就会形成数据孤岛,多维数据无法融合,这个项目可以帮你将多维数据进行融合并对个人数据进行分析,这样你就可以更直观、深入了解自己的信息

InfoSpider 是一个集众多数据源于一身的爬虫工具箱,旨在安全快捷的帮助用户拿回自己的数据,工具代码开源,流程透明。并提供数据分析功能,基于用户数据生成图表文件,使得用户更直观、深入了解自己的信息。 


目前支持数据源包括GitHub、QQ邮箱、网易邮箱、阿里邮箱、新浪邮箱、Hotmail邮箱、Outlook邮箱、京东、淘宝、支付宝、中国移动、中国联通、中国电信、知乎、哔哩哔哩、网易云音乐、QQ好友、QQ群、生成朋友圈相册、浏览器浏览历史、12306、博客园、CSDN博客、开源中国博客、简书

根据创建者介绍,InfoSpider 具有以下特性:

  • 安全可靠:本项目为开源项目,代码简洁,所有源码可见,本地运行,安全可靠。

  • 使用简单:提供 GUI 界面,只需点击所需获取的数据源并根据提示操作即可。

  • 结构清晰:本项目的所有数据源相互独立,可移植性高,所有爬虫脚本在项目的 Spiders 文件下。

  • 数据源丰富:本项目目前支持多达24+个数据源,持续更新。

  • 数据格式统一:爬取的所有数据都将存储为json格式,方便后期数据分析。

  • 个人数据丰富:本项目将尽可能多地为你爬取个人数据,后期数据处理可根据需要删减。

  • 数据分析:本项目提供个人数据的可视化分析,目前仅部分支持。

InfoSpider使用起来也非常简单,你只需要安装python3和Chrome浏览器,运行 python3 main.py,在打开的窗口点击数据源按钮, 根据提示选择数据保存路径,接着输入账号密码,就会自动爬取数据,根据下载的目录就可以查看爬下来的数据。

当然如果你想自己去练习和学习爬虫,作者也开源了所有的爬取代码,非常适合实战。

举个例子,比如爬取taobao的:

import json
import random
import time
import sys
import os
import requests
import numpy as np
import math
from lxml import etree
from pyquery import PyQuery as pq
from selenium import webdriver
from selenium.webdriver import ChromeOptions
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver import ChromeOptions, ActionChains
from tkinter.filedialog import askdirectory
from tqdm import trangedef ease_out_quad(x):return 1 - (1 - x) * (1 - x)def ease_out_quart(x):return 1 - pow(1 - x, 4)def ease_out_expo(x):if x == 1:return 1else:return 1 - pow(2, -10 * x)def get_tracks(distance, seconds, ease_func):tracks = [0]offsets = [0]for t in np.arange(0.0, seconds, 0.1):ease = globals()[ease_func]offset = round(ease(t / seconds) * distance)tracks.append(offset - offsets[-1])offsets.append(offset)return offsets, tracksdef drag_and_drop(browser, offset=26.5):knob = browser.find_element_by_id('nc_1_n1z')offsets, tracks = get_tracks(offset, 12, 'ease_out_expo')ActionChains(browser).click_and_hold(knob).perform()for x in tracks:ActionChains(browser).move_by_offset(x, 0).perform()ActionChains(browser).pause(0.5).release().perform()def gen_session(cookie):session = requests.session()cookie_dict = {}list = cookie.split(';')for i in list:try:cookie_dict[i.split('=')[0]] = i.split('=')[1]except IndexError:cookie_dict[''] = irequests.utils.add_dict_to_cookiejar(session.cookies, cookie_dict)return sessionclass TaobaoSpider(object):def __init__(self, cookies_list):self.path = askdirectory(title='选择信息保存文件夹')if str(self.path) == "":sys.exit(1)self.headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36',}option = ChromeOptions()option.add_experimental_option('excludeSwitches', ['enable-automation'])option.add_experimental_option("prefs", {"profile.managed_default_content_settings.images": 2})  # 不加载图片,加快访问速度option.add_argument('--headless')self.driver = webdriver.Chrome(options=option)self.driver.get('https://i.taobao.com/my_taobao.htm')for i in cookies_list:self.driver.add_cookie(cookie_dict=i)self.driver.get('https://i.taobao.com/my_taobao.htm')self.wait = WebDriverWait(self.driver, 20)  # 超时时长为10s# 模拟向下滑动浏览def swipe_down(self, second):for i in range(int(second / 0.1)):# 根据i的值,模拟上下滑动if (i % 2 == 0):js = "var q=document.documentElement.scrollTop=" + str(300 + 400 * i)else:js = "var q=document.documentElement.scrollTop=" + str(200 * i)self.driver.execute_script(js)time.sleep(0.1)js = "var q=document.documentElement.scrollTop=100000"self.driver.execute_script(js)time.sleep(0.1)# 爬取淘宝 我已买到的宝贝商品数据, pn 定义爬取多少页数据def crawl_good_buy_data(self, pn=3):# 对我已买到的宝贝商品数据进行爬虫self.driver.get("https://buyertrade.taobao.com/trade/itemlist/list_bought_items.htm")# 遍历所有页数for page in trange(1, pn):data_list = []# 等待该页面全部已买到的宝贝商品数据加载完毕good_total = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#tp-bought-root > div.js-order-container')))# 获取本页面源代码html = self.driver.page_source# pq模块解析网页源代码doc = pq(html)# # 存储该页已经买到的宝贝数据good_items = doc('#tp-bought-root .js-order-container').items()# 遍历该页的所有宝贝for item in good_items:# 商品购买时间、订单号good_time_and_id = item.find('.bought-wrapper-mod__head-info-cell___29cDO').text().replace('\n', "").replace('\r', "")# 商家名称# good_merchant = item.find('.seller-mod__container___1w0Cx').text().replace('\n', "").replace('\r', "")good_merchant = item.find('.bought-wrapper-mod__seller-container___3dAK3').text().replace('\n', "").replace('\r', "")# 商品名称# good_name = item.find('.sol-mod__no-br___1PwLO').text().replace('\n', "").replace('\r', "")good_name = item.find('.sol-mod__no-br___3Ev-2').text().replace('\n', "").replace('\r', "")# 商品价格  good_price = item.find('.price-mod__price___cYafX').text().replace('\n', "").replace('\r', "")# 只列出商品购买时间、订单号、商家名称、商品名称# 其余的请自己实践获取data_list.append(good_time_and_id)data_list.append(good_merchant)data_list.append(good_name)data_list.append(good_price)#print(good_time_and_id, good_merchant, good_name)#file_path = os.path.join(os.path.dirname(__file__) + '/user_orders.json')# file_path = "../Spiders/taobao/user_orders.json"json_str = json.dumps(data_list)with open(self.path + os.sep + 'user_orders.json', 'a') as f:f.write(json_str)# print('\n\n')# 大部分人被检测为机器人就是因为进一步模拟人工操作# 模拟人工向下浏览商品,即进行模拟下滑操作,防止被识别出是机器人# 随机滑动延时时间swipe_time = random.randint(1, 3)self.swipe_down(swipe_time)# 等待下一页按钮 出现good_total = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '.pagination-next')))good_total.click()time.sleep(2)# while 1:#     time.sleep(0.2)#     try:#         good_total = self.driver.find_element_by_xpath('//li[@title="下一页"]')#         break#     except:#         continue# # 点击下一页按钮# while 1:#     time.sleep(2)#     try:#         good_total.click()#         break#     except Exception:#         pass# 收藏宝贝 传入爬几页 默认三页  https://shoucang.taobao.com/nodejs/item_collect_chunk.htm?ifAllTag=0&tab=0&tagId=&categoryCount=0&type=0&tagName=&categoryName=&needNav=false&startRow=60def get_choucang_item(self, page=3):url = 'https://shoucang.taobao.com/nodejs/item_collect_chunk.htm?ifAllTag=0&tab=0&tagId=&categoryCount=0&type=0&tagName=&categoryName=&needNav=false&startRow={}'pn = 0json_list = []for i in trange(page):self.driver.get(url.format(pn))pn += 30html_str = self.driver.page_sourceif html_str == '':breakif '登录' in html_str:raise Exception('登录')obj_list = etree.HTML(html_str).xpath('//li')for obj in obj_list:item = {}item['title'] = ''.join([i.strip() for i in obj.xpath('./div[@class="img-item-title"]//text()')])item['url'] = ''.join([i.strip() for i in obj.xpath('./div[@class="img-item-title"]/a/@href')])item['price'] = ''.join([i.strip() for i in obj.xpath('./div[@class="price-container"]//text()')])if item['price'] == '':item['price'] = '失效'json_list.append(item)# file_path = os.path.join(os.path.dirname(__file__) + '/shoucang_item.json')json_str = json.dumps(json_list)with open(self.path + os.sep + 'shoucang_item.json', 'w') as f:f.write(json_str)# 浏览足迹 传入爬几页 默认三页  https://shoucang.taobao.com/nodejs/item_collect_chunk.htm?ifAllTag=0&tab=0&tagId=&categoryCount=0&type=0&tagName=&categoryName=&needNav=false&startRow=60def get_footmark_item(self, page=3):url = 'https://www.taobao.com/markets/footmark/tbfoot'self.driver.get(url)pn = 0item_num = 0json_list = []for i in trange(page):html_str = self.driver.page_sourceobj_list = etree.HTML(html_str).xpath('//div[@class="item-list J_redsList"]/div')[item_num:]for obj in obj_list:item_num += 1item = {}item['date'] = ''.join([i.strip() for i in obj.xpath('./@data-date')])item['url'] = ''.join([i.strip() for i in obj.xpath('./a/@href')])item['name'] = ''.join([i.strip() for i in obj.xpath('.//div[@class="title"]//text()')])item['price'] = ''.join([i.strip() for i in obj.xpath('.//div[@class="price-box"]//text()')])json_list.append(item)self.driver.execute_script('window.scrollTo(0,1000000)')# file_path = os.path.join(os.path.dirname(__file__) + '/footmark_item.json')json_str = json.dumps(json_list)with open(self.path + os.sep + 'footmark_item.json', 'w') as f:f.write(json_str)# 地址def get_addr(self):url = 'https://member1.taobao.com/member/fresh/deliver_address.htm'self.driver.get(url)html_str = self.driver.page_sourceobj_list = etree.HTML(html_str).xpath('//tbody[@class="next-table-body"]/tr')data_list = []for obj in obj_list:item = {}item['name'] = obj.xpath('.//td[1]//text()')item['area'] = obj.xpath('.//td[2]//text()')item['detail_area'] = obj.xpath('.//td[3]//text()')item['youbian'] = obj.xpath('.//td[4]//text()')item['mobile'] = obj.xpath('.//td[5]//text()')data_list.append(item)# file_path = os.path.join(os.path.dirname(__file__) + '/addr.json')json_str = json.dumps(data_list)with open(self.path + os.sep + 'address.json', 'w') as f:f.write(json_str)if __name__ == '__main__':# passcookie_list = json.loads(open('taobao_cookies.json', 'r').read())t = TaobaoSpider(cookie_list)t.get_orders()# t.crawl_good_buy_data()# t.get_addr()# t.get_choucang_item()# t.get_footmark_item()

后台回复关键词【入群

加入卖萌屋NLP/IR/Rec与求职讨论群

后台回复关键词【顶会

获取ACL、CIKM等各大顶会论文集!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/479126.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android官方开发文档Training系列课程中文版:高效显示位图之管理位图内存

原文地址:http://developer.android.com/training/displaying-bitmaps/manage-memory.html 除了在上一节中描述的步骤之外,还有一些细节上的事情可以促进垃圾回收器的回收及位图的复用。其推荐的策略取决于Android的目标版本。示例APP BitmapFun展示了如…

Pytorch与tensorflow模型转换

使用pytorch_pretrained_bert将tensorflow模型转化为pytorch模型:https://blog.csdn.net/sunyueqinghit/article/details/103458365/ bert_config.json bert_model.ckpt.data-00000-of-00001 bert_model.ckpt.index bert_model.ckpt.meta vocab.txt 比如&#xff…

LeetCode 413. 等差数列划分(DP)

1. 题目 一个数列的等差数列子数组有多少个。 A [1, 2, 3, 4]返回: 3, A 中有三个子等差数组: [1, 2, 3], [2, 3, 4] 以及自身 [1, 2, 3, 4]。2. 解题 状态公式 if(A[i]−A[i−1]A[i−1]−A[i−2]),thendp[i]dp[i−1]1,i>2if (A[i]-A[i-1] A[i-1]-A[i-2]) , \quad then \…

技术动态 | 针对复杂问题的知识图谱问答最新进展

本文转载自公众号:PaperWeekly。作者:付彬、唐呈光、李杨、余海洋、孙健单位:阿里巴巴达摩院小蜜Conversational AI团队背景介绍知识图谱问答(KBQA)利用图谱丰富的语义关联信息,能够深入理解用户问题并给出…

百度提出新冠高风险小区预警算法,AAAI21收录!

编:夕小瑶几个月前,小屋推送了一期上帝视角看新型冠状病毒(COVID-19)对公众出行影响的顶会论文解读——《这篇顶会paper,讲述了疫情期间憋疯的你和我》,这篇有趣的paper来自百度地图团队,发表在…

搜狗地图2016-Android-社招笔试题(包含Java基础部分)

下面是搜狗地图的社招笔试题,由于条件有限,全是手机拍的,请将就着看。另请忽略上面的答案,不一定准确。 大伙可在下方讨论答案,上方答案仅供参考,不一定准确。

机器学习常用的算法整理:线性回归、逻辑回归、贝叶斯分类、支持向量机、K-means聚类、决策树、随机森林以及常用的应用场景整理

什么是机器学习? 机器学习是计算机利用已有的数据(经验)得出了某种模型,并利用这些模型预测未来的一种方法。这个过程其实与人的学习过程极为相似,只不过机器是一个可以进行大维度数据分析而且可以不知疲倦地学习的“怪兽”而已。 具体的机器…

新一代数据库TiDB在美团的实践

1. 背景和现状 近几年,基于MySQL构建的传统关系型数据库服务,已经很难支撑美团业务的爆发式增长,这就促使我们去探索更合理的数据存储方案和实践新的运维方式。而随着分布式数据库大放异彩,美团DBA团队联合基础架构存储团队&#…

我在哥大读博的五年

文 | Mike Shou知乎(ID:Showthem)本文已获作者授权,禁止二次转载0. 写在前面「 开始写这边总结的时候是三月,纽约成了疫情震中,看着新闻报道里的中央公园,中国城,第五大道,往事浮现&…

Android官方开发文档Training系列课程中文版:高效显示位图之在UI中展示位图

原文地址:http://android.xsoftlab.net/training/displaying-bitmaps/display-bitmap.html 这节课会将前面的知识点整合到一起,展示如何使用后台线程、位图缓存来加载多张图片到ViewPager或者GridView中,并会涉及并发处理及配置更改的相关知…

论文浅尝 | AAAI2020 - 多分量图卷积协同过滤方法

论文笔记整理:郝凯龙,南京大学硕士。来源:AAAI2020链接:https://arxiv.org/pdf/1911.10699.pdf动机推荐系统实际上是在做用户-商品二部图上的链路预测,仅仅用用户-商品之间的单一购买关系无法精确的进行描述为什么购买…

from torchcrf import CRF

报错CRF函数有问题,多了一个参数。通过源代码查找,发现两个torchcrf。通过pip list安装的时候是大写的TorchCRF,所以导入包的时候肯定也写大写的,没想到报错,后来改成全小写的就对了。

LeetCode 312. 戳气球(DP,难)

1. 题目 有 n 个气球,编号为0 到 n-1,每个气球上都标有一个数字,这些数字存在数组 nums 中。 现在要求你戳破所有的气球。每当你戳破一个气球 i 时,你可以获得 nums[left]∗nums[i]∗nums[right]nums[left] * nums[i] * nums[ri…

美团即时物流的分布式系统架构设计

本文根据美团资深技术专家宋斌在ArchSummit架构师峰会上的演讲整理而成。 背景 美团外卖已经发展了五年,即时物流探索也经历了3年多的时间,业务从零孵化到初具规模,在整个过程中积累了一些分布式高并发系统的建设经验。最主要的收获包括两点&…

Android官方开发文档Training系列课程中文版:OpenGL绘图之环境配置

原文地址:http://android.xsoftlab.net/training/graphics/opengl/index.html 引言 Android framework层为创建绚丽的功能性UI提供了大量的标准工具。然而,如果想要以更多方式来控制屏幕的绘制,或者在三维图形中绘制,那么就需要…

中文常用停用词表(哈工大停用词表、百度停用词表

中文常用停用词表(哈工大停用词表、百度停用词表等:https://github.com/goto456/stopwords

论文浅尝 | AAAI2020 - 基于规则的知识图谱组合表征学习

论文笔记整理:康矫健,浙江大学计算机科学与技术系,硕士研究生。论文链接:https://arxiv.org/pdf/1911.08935.pdf发表会议:AAAI 2020Motivation现有的KG Embedding方法大部分仅关注每个三元组的结构化信息有部分的工作把…

26岁!年入100万,两周把 Github 项目推向全球榜首,他是怎么做的?

今天要为大家介绍一位很厉害的朋友 —— 小浩。九零后,20 年年收入近百万。 大家不需要质疑他的收入,在他没做公众号的时候,我知道收入已有五六十。而公众号,只是疫情期间他因无聊而产出的结果,那结果怎么样呢&#xf…

美团餐饮娱乐知识图谱——美团大脑揭秘

前言 “ I’m sorry. I can’t do that, Dave.” 这是经典科幻电影《2001: A Space Odyssey》里HAL 9000机器人说的一句话,浓缩了人类对终极人工智能的憧憬。让机器学会说这样简单一句话,需要机器具备情感认知、自我认识以及对世界的认识,来辅…

Android官方开发文档Training系列课程中文版:OpenGL绘图之图形定义

原文地址:http://android.xsoftlab.net/training/graphics/opengl/shapes.html 使用OpenGL绘制图形的第一步就是要定义一个图形。如果不清楚OpenGL如何绘制自定义图形的相关基础知识时,那么使用OpenGL一定要仔细。 这节课将会简单讲述OpenGl ES的坐标系…