Python - 爬虫爬取和登陆github

Python 网络爬虫实战—《爬取 GitHub 的项目信息》 通过本文的介绍,相信读者对如何使用 Python 编写网络爬虫来爬取 GitHub 的项目信息有了一定的了解。当然,GitHub 作为一个开放的平台,提供了丰富的 API,也是获取项目信息的另一个很好的途径,读者可以根据实际需求选择合适的方法来获取数据。祝大家爬取数据顺利,分析愉快! 阅读详情

用API搜索GitHub中star数最多的前十个库,并用post方法登陆并点击收藏


一 用API搜索GitHub中star数最多的前十个库

利用GitHub提供的API爬取前十个star数量最多的Python库

    GitHub提供了很多专门为爬虫准备的API接口,通过接口可以爬取到便捷,易处理的信息。(这是GitHub官网的各种api介绍)

    我将要使用的链接是https://api.github.com/search/repositories?q=language:python&sort=stars。 ‘language:’后是要搜索的语言,‘sort=’后是搜索的排序方式,这个链接以star数量返回前三十个Python库的信息。

    使用到的库

import requests

    通过get请求到网页的信息

response = requests.get('https://api.github.com/search/repositories?q=language:python&sort=stars')
#检测是否请求成功,若成功,状态码应该是200
if(response.status_code != 200):
    print('error: fail to request')

若我们自己点入上方的链接,会发现一个特别的网页,没有界面,只有由简单的字符组成。

    仔细观察,会发现字符和字典的结构是相同的,最上层是三个关键词,其中 'items'关键词存储有一个List,里面有多组字典信息,每一个字典存储有一个python库的详细信息。

    所以直接提取相应信息即可

#获取的是一个json格式的字典对象
j = response.json()
#'items'下包括了前三十个库的所有详细信息
items= j['items']

#存储前十个数据
message = []
for i in range(10):
    pro = items[i]
    message.append(pro['full_name'])#库的'作者/名字'
    #依次打印
    print('top%d:' % (i+1), pro['name'])#打印库的名字

     打印结果:

top1: awesome-python
top2: system-design-primer
top3: models
top4: public-apis
top5: youtube-dl
top6: flask
top7: thefuck
top8: httpie
top9: django
top10: awesome-machine-learning

    完整代码:

'''
用于打印并返回前十个最受欢迎的库
传入的是搜索的语言,这个程序需要传入'python',
返回的是一个存有前十个库的'作者名/库名'的List
'''
def find_top10(language):
    #利用github提供的api接口进行搜索
    response = requests.get(
        "https://api.github.com/search/repositories?q=language:%s&sort=stars"%(language))

    #检测是否请求成功
    if(response.status_code != 200):
        print('error! in find_top10(): fail to request')
        return None

    #获取的是一个json格式的字典对象
    j = response.json()
    #keyword 'items'下的包括了前三十个库的所有详细信息
    progress = j['items']

    #存储前十个数据
    message = []
    for i in range(10):
        pro = j['items'][i]
        message.append(pro['full_name'])
        #依次打印
        print('top%d:' % (i+1), pro['name'])
    return message

二 用post方法登陆GitHub

    先撸一撸post需要的东西。首先我们肯定要知道我们的url是什么,其次我们得知道我们需要提交哪些信息(data)

    我们先点开GitHub的登陆界面,尝试着登陆,利用谷歌的“右键->检查->network"查看登陆时的信息。

    找到了登陆需要使用的url,以及登陆时需要上传的信息(data)

   但我们发现,Data中有一个authenticity_token,知乎也有这个东西,貌似是用来保证安全用的。但重点是,我们从哪儿去找这个值呢?

    authenticity_token的值往往隐藏在上一级网页内

    果然,在登陆界面的网页代码中找到了隐藏的authenticity_token信息(记住这个方法)

    

    我们根据上方信息进行登陆:(authenticity_token值需要用爬虫寻找而不能直接复制浏览器中的值!)

    用get方法获取登陆界面的信息,得到cookies以及authenticity_token

r1 = requests.get('https://github.com/login')

    soup = BeautifulSoup(r1.text, features='lxml')
     #获取authenticity_token
    att = soup.find(name='input', attrs={'name': 'authenticity_token'}).get('value')
    #获取cookies
    cookie = r1.cookies.get_dict()

    利用得到的信息构造Data并登陆 

r2 = requests.post(
    'https://github.com/session',
    data={
        'commit': 'Sign in',
        'utf8': '✓',
        'authenticity_token': att,
        'login': username,
        'password': password
        },
    cookies=cookie
)
#返回登陆后的cookies可用于以登陆身份访问GitHub
return r2.cookies.get_dict()

    完整代码: 

'''
用于登陆github的函数
传入账号密码,登陆并返回登陆后的cookies
'''
def login(username, password):
    #get登陆页面并获取 authenticity_token 和 cookies(登陆需要)
    r1 = requests.get('https://github.com/login')

    if(r1.status_code != 200):
        print('error! in login(): fail to request')
        return None

    soup = BeautifulSoup(r1.text, features='lxml')
     #获取authenticity_token
    att = soup.find(name='input', attrs={
                        'name': 'authenticity_token'}).get('value')
    #获取cookies
    cookie = r1.cookies.get_dict()
    #利用获取的信息登陆github
    r2 = requests.post(
        'https://github.com/session',
        data={
            'commit': 'Sign in',
            'utf8': '✓',
            'authenticity_token': att,
            'login': username,
            'password': password
        },
        cookies=cookie
    )

    if(r2.status_code != 200):
        print('error! in login(): fail to request')
        return None
        
    print('successed login')
    return r2.cookies.get_dict()

三 用post方法收藏star数量最多的前十个python仓库

    我们已经找到了这十个库,也成功登陆了GitHub

    所以我们现在需要做的就是寻找收藏某个一个库的方法

    我随便点开了一个库‘thefuck',可以在右上角找到star的按钮

    于是我用登陆时同样的方法,点击按钮,并用谷歌分析信息,

    成功的找到了post的url地址,以及需要提交的data

 

    我们又看到了熟悉的authenticity_token!真是麻烦啊,但我们已经学会了如何寻找这个值

    果然,我在这个网页的代码里面找到了隐藏的authenticity_token。

    所以我们需要用get方法得到这个网页,并在网页代码中找到这个值

    

    通过get获取authenticity_token,这里传入了登陆之后得到的cookies

get2 = requests.get(
        'https://github.com/nvbn/thefuck',
        cookies=cookie
    )
    #更新cookies
    cookie = get2.cookies.get_dict()
    
    #得到authenticity_token
    soup2 = BeautifulSoup(get2.text, features='lxml')
    #据分析,star的authenticity_token是放于class属性为unstarred js-social-form的块中
    soup = soup2.find('form', {'class': 'unstarred js-social-form'})
    att2 = soup.find(name='input', attrs={
        'name': 'authenticity_token'}).get('value')

     提交post请求进行收藏,提交成功后便收藏成功

#提交Post请求,请求之后即收藏了该库
r = requests.post(
    'https://github.com/nvbn/thefuck/star',
        data={
         'utf8': '✓',
        'authenticity_token': att2,
        'context': 'repository'
    },
    cookies=cookie
 )

    完整代码: 

'''
利用登陆的cookies点击star收藏项目

这里我分析了某个库的网页代码,按钮'star'中,提供了一‘authenticity_token’和一个用于post的链接(https://github.com/作者名/库名/star),只要获取‘authenticity_token’并用登陆的cookies访问链接,即可实现点击该按钮的同样效果。

所以只需要传入cookies 和 作者名/库名即可
'''
def get_stared(cookie, name):
    #get到该库的界面并得到用于 点击star的post提交的authenticity_token
    get2 = requests.get(
        #利用传入的‘作者名/库名’进行操作
        'https://github.com/%s'%(name),
        cookies=cookie
    )
    cookie = get2.cookies.get_dict()
    #检验请求情况
    if(response.status_code != 200):
        print('error! in get_stared(): get: fail to request')
        return None
    
    #得到authenticity_token
    soup2 = BeautifulSoup(get2.text, features='lxml')
    soup = soup2.find('form', {'class': 'unstarred js-social-form'})
    att2 = soup.find(name='input', attrs={
        'name': 'authenticity_token'}).get('value')

    #提交Post请求,请求之后即收藏了该库
    r = requests.post(
        'https://github.com/%s/star'%(name),
        data={
            'utf8': '✓',
            'authenticity_token': att2,
            'context': 'repository'
        },
        cookies=cookie
    )
    #检验请求情况,这里比较特殊,返回错误码400的时候收藏成功
    if(response.status_code != 400):
        print('error! in get_stared(): get: fail to request')
        return None

全部代码:加入了运行需要的函数和句子

'''
1.利用爬虫登陆github
2.搜所前十个最受欢迎的Python库(star数作为排序标准)
3.并收藏它们

名字:周开颜
学号:2017141461386

经测试,所有功能成功实现
'''

import requests
from bs4 import BeautifulSoup

'''
用于登陆github的函数
传入账号密码,登陆并返回登陆后的cookies
'''


def login(username, password):
    #get登陆页面并获取 authenticity_token 和 cookies(登陆需要)
    r1 = requests.get('https://github.com/login')
    soup = BeautifulSoup(r1.text, features='lxml')

    #获取authenticity_token
    att = soup.find(name='input', attrs={
        'name': 'authenticity_token'}).get('value')
    #获取cookies
    cks = r1.cookies.get_dict()

    #利用获取的信息登陆github
    r2 = requests.post(
        'https://github.com/session',
        data={
            'commit': 'Sign in',
            'utf8': '✓',
            'authenticity_token': att,
            'login': username,
            'password': password
        },
        cookies=cks
    )
    print("successed login!")
    return r2.cookies.get_dict()


'''
用于打印并返回前十个最受欢迎的库
传入的是搜索的语言,这个程序需要传入'python',
返回的是一个存有前十个库的'作者名/库名'的List
'''


def find_top10(language):
    #利用github提供的api接口进行搜索
    response = requests.get(
        "https://api.github.com/search/repositories?q=language:%s&sort=stars" % (language))

    #检测是否请求成功
    if(response.status_code != 200):
        print('error! in find_top10(): fail to request')
        return None

    #获取的是一个json格式的字典对象
    j = response.json()
    #keyword 'items'下的包括了前三十个库的所有详细信息
    progress = j['items']

    #存储前十个数据
    message = []
    for i in range(10):
        pro = j['items'][i]
        message.append(pro['full_name'])
        #依次打印
        print('top%d:' % (i+1), pro['name'])
    return message


'''
利用登陆的cookies点击star收藏项目

这里我分析了某个库的网页代码,按钮'star'中,提供了一‘authenticity_token’和一个用于post的链接(https://github.com/作者名/库名/star),只要获取‘authenticity_token’并用登陆的cookies访问链接,即可实现点击该按钮的同样效果。

所以只需要传入cookies 和 作者名/库名即可
'''


def get_stared(cookie, name):
    #get到该库的界面并得到用于 点击star的post提交的authenticity_token
    get2 = requests.get(
        #利用传入的‘作者名/库名’进行操作
        'https://github.com/%s' % (name),
        cookies=cookie
    )
    cookie = get2.cookies.get_dict()
    #检验请求情况
    if(get2.status_code != 200):
        print('error! in get_stared(): get: fail to request')
        return None

    #得到authenticity_token
    soup2 = BeautifulSoup(get2.text, features='lxml')
    soup = soup2.find('form', {'class': 'unstarred js-social-form'})
    att2 = soup.find(name='input', attrs={
        'name': 'authenticity_token'}).get('value')

    #提交Post请求,请求之后即收藏了该库
    r = requests.post(
        'https://github.com/%s/star' % (name),
        data={
            'utf8': '✓',
            'authenticity_token': att2,
            'context': 'repository'
        },
        cookies=cookie
    )
    #检验请求情况,这里比较特殊,返回错误码400的时候收藏成功
    if(r.status_code != 400):
        print('error! in get_stared(): post: fail to request')
        return None
    print(name, 'stared')


#主函数
if __name__ == '__main__':
    #登陆
    id = input('please input your github id\n')
    ps = input('please input your github password\n')
    coks = login(id, ps)

    #获取前十个最受欢迎的python库
    messages = find_top10('python')

    #为这十个库点star(收藏)
    for m in messages:
        if(type(m) == str):
            get_stared(coks, m)

 

Python爬虫+PyQt 打造教务系统查成绩程序 python爬虫和PyQt的结合 阅读详情

相关推荐

Python爬取网站用户手机号_主流网站 Python 爬虫模拟登陆方法汇总

欢迎关注我的公众号:高级农民工,博客:高级农民工,阅读体验更好。摘要:介绍微信、知乎、新浪等一众主流网站的模拟登陆爬取方法。网络上有形形色色的网站,不同类型的网站爬虫策略不同,难易程度也不一样。从是否需要登陆来说,一些简单网站不需要登陆就可以爬,比如之前爬过的猫眼电影、东方财富网等。有一些网站需要先登陆才能爬,比如知乎、微信等。这类网站在模拟登陆时需要处理验证码、js 加密参数这些问题,爬取难度会...

weixin_39867125的博客 3590

在github中最好用的19个Python爬虫推荐,建议收藏!

可依据不同的主题存储到Excel不同的Sheet ,采用User Agent伪装为浏览器进行爬取,并加入随机延时来更好的模仿浏览器行为,避免爬虫被封。以hao123为入口页面,滚动爬取外链,收集网址,并记录网址上的内链和外链数目,记录title等信息,windows7 32位上测试,目前每24个小时,可收集数据为10万左右。总数据数:20119918,抓取字段:用户id,昵称,性别,头像,等级,经验值,粉丝数,生日,地址,注册时间,签名,等级与经验值等。涵盖链家爬虫一文的全部代码,包括链家模拟登录代码。

大模型研究中心 1万+

用python根据关键字爬取Github上包含某关键字的代码链接

0.项目背景 导师的一篇论文需要用到包含某一个关键字Github上的代码片段,所以我写了一个爬虫项目将github上面包含某一关键字的代码链接全部爬取出来,并存入csv文件中。 1.开发环境和工具模块 python版本:python 3.6 开发用的IDE:pycharm 所用的第三方库: 爬虫:requests + BeautifulSoup                     ...

tspxxx的博客 4581

GitHub 上有哪些优秀的 Python 爬虫项目?

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。(全套教程文末领取哈)

m0_59235245的博客 3277

python爬虫——scrapy+selenium爬取新浪微博及评论

本文主要对爬取过程中所用到的知识做简单总结,最后有项目链接。 一、项目简介 本项目利用python的scrapy框架+selenium模拟登陆微博来爬取带有关键字的微博及微博下面的评论(1 、2级评论)。 当时自己比较关注“小凤雅事件”,而微博又是舆论的战场,就想爬取“小凤雅事件”的相关微博以及评论,看看大家的关注点在哪里,于是就行动起来了。 下面是对主要技术的介绍。 二、scrapy介...

csdn950212的博客 7669

python3爬虫开发实践崔庆才——练习模拟登陆爬取Github

coding:utf-8 import requests from lxml import etree class Login(object): def init(self): self.headers = { ‘Referer’: ‘https://github.com/’, ‘User-Agent’: ‘Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWeb...

yang_0103的博客 1512

python爬取知乎live_Python 爬虫如何机器登录新浪微博并抓取内容?

(更新至2019.04.17) 采用session(使用用户名+密码)模拟爬虫登陆(参见HeZhang1994/weibo-crawler项目的程序注释,详细介绍了如何获取/设置session信息)。原答案中爬虫采用cookie模拟登陆。如果爬取微博数量较多,或爬取时间较长,cookie会失效,导致无法爬取视频。采用session的好处是登陆过程一直有效,但可能会出现ConnectionError...

weixin_39945531的博客 228

新浪微博爬虫

详解新浪微博爬取过程 前言 因为科研需要,我从16年8月起就开始跟微博数据打交道,所以从那时开始就不得不想尽办法爬取微博数据,我爬取的内容主要是:博文、发博账号、发文时间、爬取时间、点赞数/评论数/转发数,详情如图1。经过长时间的总结和实验,我完善了切实可行的爬虫代码,代码被我放在github上,同样你也可以在我的个人博客open-source里面查看到weibospider项目。 欢迎大家

毛毛虫_Wendy的博客 7263

Python_模拟登陆并爬取Github

模拟登陆并爬取Github 1、准备工作 以Github为例实现模拟登陆过程 安装好requests库,lxml库 封装后的完整代码见链接,实现登陆并爬取,简易的见页面末尾 https://github.com/Shirmay1/Python3Spider/blob/master/SignIn_Github/Simulate_Singin.py 2、分析登陆过程 分析登陆应该请求的URL为:...

十一姐的博客 1120

分享68个Python爬虫源码总有一个是你想要的

基于Python requests的人人词典数据爬虫,数据共10G左右,爬取时间1小时左右,爬取站点http &&www91dict com 包含:单词、单词词性及翻译、单词发音、单词例句剧照、单词例句及翻译、单词例句发音。Python-FastAPI,Django,Docker 资料整理,数据结构,算法,OCR图像识别处理,爬虫,反向爬取,验证码,操作pdf,反爬策略及应对方案。python相关的一些小程序,小想法,包括爬虫,数据分析,机器学习,计算机视觉,(card_ocr)

zy0412326的专栏 1166

Mac微信聊天记录备份终极指南:用软链接轻松迁移到外接硬盘(附重签名教程)

本文详细介绍了如何通过软链接技术将Mac微信聊天记录备份迁移到外接硬盘,解决内置存储空间不足的问题。教程包括备份文件定位、软链接创建及微信重签名步骤,帮助用户高效管理微信数据,释放Mac存储空间。

uuu88的博客 1164

通过Python爬虫爬取知乎某个问题下的图片

该爬虫主要是通过requests来实现的,该模块完全可以很好的代替urllib和urllib2,而且功能更强大,详细可以看这里。同时也用到了pillow模块中的image对象,实现环境是Python2,不过在Python3上只需很小的改动就可以正常运行。 首先通过cookie模拟登陆到知乎,然后获取知乎某一个问题的链接,打开并获取该问题回答下的图片,然后保存到本地。我们先看下知乎中的网页

磊啊磊 2万+

保姆级教程:用STM32H743+TJA1042T玩转FDCAN,CubeMX配置1M/5M双速率通信(附完整代码)

本文提供STM32H743与TJA1042T实现FDCAN双速率通信的保姆级教程,详细讲解CubeMX配置1M/5M双速率通信的全过程,包括硬件连接、时钟树配置、过滤器设置及中断管理,并附完整代码示例,助力开发者快速掌握FDCAN高速通信技术。

weixin_30698297的博客 473

爬虫模拟登陆并爬取Github实现

一 代码 import requests from lxml import etree class Login(object): def __init__(self): self.headers = { 'Referer': 'https://github.com/', 'User-Agent': 'Mozilla/5...

实践求真知 2042

避坑指南:ArcGIS 做莫兰指数分析,你的‘空间关系概念化’选对了吗?

本文深入解析了ArcGIS中莫兰指数分析的关键参数——'空间关系概念化'的选择策略。通过对比反距离法、固定距离法和K最近邻法的适用场景与影响机制,帮助研究者避免常见误区,提升空间自相关分析的准确性和解释力。特别针对全域莫兰指数和局域莫兰指数的计算差异提供了实用建议。

weixin_30872157的博客 805

生成对抗网络——CGAN(代码+理解)

CGAN(Conditional Generative Adversarial Network)模型是一种 深度学习模型,属于生成对抗网络(GAN)的一种 变体。它的 基本思想是通过 训练生成器和判别器两个网络,使生成器能够生成与给定条件 相匹配的 合成数据,而判别器则 负责区分真实数据和 生成数据。相比于GAN它引入了条件信息(y),使得生成器可以生成与给定条件相匹配的合成数据,从而提高了生成数据的可控性和针对性。

CXDNW的博客 1万+

python爬虫实例项目大全-GitHub 上有哪些优秀的 Python 爬虫项目?

有一些给你推荐一下,参考龙鹏-言有三:【杂谈】GitHub上有哪些好用的爬虫(从Google百度,腾讯视频抖音,豆瓣知乎到不可描述)?zhuanlan.zhihu.com1、awesome-spider地址:https://github.com/facert/awesome-spider这是ID为facert的一个知乎工程师开源的,star6000+,内容如下:这一款爬虫,里面搜集了几乎所有可以爬...

weixin_37988176的博客 2945

工业视觉中HDR算法的动态范围优化与Debevec/Mertens方法实践

本文深入探讨了工业视觉中HDR(高动态范围)成像技术,重点解析了Debevec和Mertens两种核心算法。针对工业场景中因动态范围不足导致的过曝与欠曝问题,文章详细对比了两种方法的原理、实现步骤、参数调优及适用场景,为工程师在静态检测与高速产线等不同需求下,选择并实践HDR算法提供了清晰的指导。

weixin_29099217的博客 193

python爬虫系列之初识爬虫

前言 我们这里主要是利用requests模块和bs4模块进行简单的爬虫的讲解,让大家可以对爬虫有了初步的认识,我们通过爬几个简单网站,让大家循序渐进的掌握爬虫的基础知识,做网络爬虫还是需要基本的前端的知识的,下面我们进行我们的爬虫讲解 在进行实战之前,我们先给大家看下爬虫的一般讨论,方便大家看懂下面的实例 一、爬汽车之家 汽车之家这个网站没有做任何的防爬虫的限制,所以最适合我们来练手 ...

404

12V INPUT电源电路设计中的关键保护机制解析【精简】

本文深入解析了12V INPUT电源电路设计中不可或缺的关键保护机制。针对常见的电源反接、过压及浪涌等风险,文章详细拆解了PMOS防反接、TVS过压钳位、OVP芯片关断以及快速断电电路等核心防护方案的设计原理、选型要点与实战优化技巧,旨在帮助工程师构建可靠、经济的电源前端防御体系。

weixin_29158047的博客 228

华为OD机试双机位C卷-字符串解密(Py/Java/C/C++/Js/Go)

华为OD机试(机考)双机位C卷 【字符串解密】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试 - 字符串解密。

qq_45776114的博客 733

GitHub 上有哪些好用的爬虫?

GitHub 上有哪些好用的爬虫? 在开发实际项目的时候,你经常没有足够多的数据,需要自己去想办法获取,这个时候常常需要用到爬虫。然而找来找去,很可能找了很久都找不到既免费又好用的爬虫,今天就从好的爬虫开始说起,这很可能是项目成功的开始。 综述类项目与学习资料 首先给大家介绍一些非常优秀的综述和学习类项目,方便大家快速索引找到所需要的资源。 1、awesome-spider 地址:...

周红伟讲AI 1720

让 ABAP BAPI_COSTACTPLN_POSTPRIMCOST 不再沉默:一套可落地的参数一致性校验与排错打法

SAP BAPI_COSTACTPLN_POSTPRIMCOST 沉默失败分析与解决方案 问题现象 使用 BAPI_COSTACTPLN_POSTPRIMCOST 上传计划数据时,接口执行不报错但数据未写入 COSP 等计划表,呈现"沉默失败"现象。 根本原因 索引关联断裂:INDEXSTRUCTURE 中 OBJECT_INDEX 和 VALUE_INDEX 未正确关联 COOBJECT 和 PERVALUE/TOTVALUE 表的数据 对象定义冲突:COOBJECT 中同一行填写了多

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 108
上一篇: STL - string用法总结
下一篇: python - pyqt数字时钟
Korpse
博客等级 码龄9年 115粉丝 25原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值