python+selenium+requests爬取我的博客粉丝的名称

爬取目标

1.本次代码是在python2上运行通过的,python3的最需改2行代码,用到其它python模块

  • selenium 2.53.6 +firefox 44
  • BeautifulSoup
  • requests

2.爬取目标网站,我的博客:https://home.cnblogs.com/u/yoyoketang
爬取内容:爬我的博客的所有粉丝的名称,并保存到txt

3.由于博客园的登录是需要人机验证的,所以是无法直接用账号密码登录,需借助selenium登录

selenium获取cookies

1.大前提:先手工操作浏览器,登录我的博客,并记住密码
(保证关掉浏览器后,下次打开浏览器访问我的博客时候是登录状态)
2.selenium默认启动浏览器是一个空的配置,默认不加载配置缓存文件,这里先得找到对应浏览器的配置文件地址,以火狐浏览器为例
3.使用driver.get_cookies()方法获取浏览器的cookies

# coding:utf-8
import requests
from selenium import webdriver
from bs4 import BeautifulSoup
import re
import time
# firefox浏览器配置文件地址
profile_directory = r‘C:\Users\admin\AppData\Roaming\Mozilla\Firefox\Profiles\yn80ouvt.default‘
# 加载配置
profile = webdriver.FirefoxProfile(profile_directory)
# 启动浏览器配置
driver = webdriver.Firefox(profile)

driver.get("https://home.cnblogs.com/u/yoyoketang/followers/")

time.sleep(3)
cookies = driver.get_cookies()  # 获取浏览器cookies
print(cookies)
driver.quit()

(注:要是这里脚本启动浏览器后,打开的博客页面是未登录的,后面内容都不用看了,先检查配置文件是不是写错了)

requests添加登录的cookies

1.浏览器的cookies获取到后,接下来用requests去建一个session,在session里添加登录成功后的cookies

s = requests.session()  # 新建session

# 添加cookies到CookieJar
c = requests.cookies.RequestsCookieJar()
for i in cookies:
    c.set(i["name"], i[‘value‘])

s.cookies.update(c)  # 更新session里cookies

计算粉丝数和分页总数

1.由于我的粉丝的数据是分页展示的,这里一次只能请求到45个,所以先获取粉丝总数,然后计算出总的页数

# 发请求
r1 = s.get("https://home.cnblogs.com/u/yoyoketang/relation/followers")

soup = BeautifulSoup(r1.content, "html.parser")

# 抓取我的粉丝数
fensinub = soup.find_all(class_="current_nav")
print fensinub[0].string
num = re.findall(u"我的粉丝\((.+?)\)", fensinub[0].string)
print u"我的粉丝数量:%s"%str(num[0])

# 计算有多少页,每页45条
ye = int(int(num[0])/45)+1
print u"总共分页数:%s"%str(ye)

保存粉丝名到txt

# 抓取第一页的数据
fensi = soup.find_all(class_="avatar_name")
for i in fensi:
    name = i.string.replace("\n", "").replace(" ","")
    print name
    with open("name.txt", "a") as f:  # 追加写入
        f.write(name.encode("utf-8")+"\n")

# 抓第二页后的数据
for i in range(2, ye+1):
    r2 = s.get("https://home.cnblogs.com/u/yoyoketang/relation/followers?page=%s"%str(i))
    soup = BeautifulSoup(r1.content, "html.parser")
    # 抓取我的粉丝数
    fensi = soup.find_all(class_="avatar_name")

    for i in fensi:
        name = i.string.replace("\n", "").replace(" ","")
        print name
        with open("name.txt", "a") as f:  # 追加写入
            f.write(name.encode("utf-8")+"\n")

参考代码:

# coding:utf-8
import requests
from selenium import webdriver
from bs4 import BeautifulSoup
import re
import time

# firefox浏览器配置文件地址
profile_directory = r‘C:\Users\admin\AppData\Roaming\Mozilla\Firefox\Profiles\yn80ouvt.default‘

s = requests.session()  # 新建session
url = "https://home.cnblogs.com/u/yoyoketang"

def get_cookies(url):
    ‘‘‘启动selenium获取登录的cookies‘‘‘
    try:
        # 加载配置
        profile = webdriver.FirefoxProfile(profile_directory)
        # 启动浏览器配置
        driver = webdriver.Firefox(profile)
        driver.get(url+"/followers")

        time.sleep(3)
        cookies = driver.get_cookies()  # 获取浏览器cookies
        print(cookies)
        driver.quit()
        return cookies
    except Exception as msg:
        print(u"启动浏览器报错了:%s" %str(msg))
def add_cookies(cookies):
    ‘‘‘往session添加cookies‘‘‘
    try:
        # 添加cookies到CookieJar
        c = requests.cookies.RequestsCookieJar()
        for i in cookies:
            c.set(i["name"], i[‘value‘])

        s.cookies.update(c)  # 更新session里cookies
    except Exception as msg:
        print(u"添加cookies的时候报错了:%s" % str(msg))

def get_ye_nub(url):
    ‘‘‘获取粉丝的页面数量‘‘‘
    try:
        # 发请求
        r1 = s.get(url+"/relation/followers")
        soup = BeautifulSoup(r1.content, "html.parser")
        # 抓取我的粉丝数
        fensinub = soup.find_all(class_="current_nav")
        print(fensinub[0].string)
        num = re.findall(u"我的粉丝\((.+?)\)", fensinub[0].string)
        print(u"我的粉丝数量:%s"%str(num[0]))

        # 计算有多少页,每页45条
        ye = int(int(num[0])/45)+1
        print(u"总共分页数:%s"%str(ye))
        return ye
    except Exception as msg:
        print(u"获取粉丝页数报错了,默认返回数量1 :%s"%str(msg))
        return 1

def save_name(nub):
    ‘‘‘抓取页面的粉丝名称‘‘‘
    try:
        # 抓取第一页的数据
        if nub <= 1:
            url_page = url+"/relation/followers"
        else:
            url_page = url+"/relation/followers?page=%s" % str(nub)
        print(u"正在抓取的页面:%s" %url_page)
        r2 = s.get(url_page, verify=False)
        soup = BeautifulSoup(r2.content, "html.parser")
        fensi = soup.find_all(class_="avatar_name")
        for i in fensi:
            name = i.string.replace("\n", "").replace(" ","")
            print(name)
            with open("name.txt", "a") as f:  # 追加写入
                f.write(name.encode("utf-8")+"\n")

            # python3的改成下面这两行
            # with open("name.txt", "a", encoding="utf-8") as f:  # 追加写入
            #     f.write(name+"\n")

    except Exception as msg:
        print(u"抓取粉丝名称过程中报错了 :%s"%str(msg))

if __name__ == "__main__":
    cookies = get_cookies(url)
    add_cookies(cookies)
    n = get_ye_nub(url)
    for i in list(range(1, n+1)):
        save_name(i)

原文地址:https://www.cnblogs.com/jason89/p/8998209.html

时间: 2024-11-25 14:59:57

python+selenium+requests爬取我的博客粉丝的名称的相关文章

python+selenium+PhantomJS爬取网页动态加载内容

一般我们使用python的第三方库requests及框架scrapy来爬取网上的资源,但是设计javascript渲染的页面却不能抓取,此时,我们使用web自动化测试化工具Selenium+无界面浏览器PhantomJS来抓取javascript渲染的页面,下面实现一个简单的爬取 环境搭建 准备工具:python3.5,selenium,phantomjs 我的电脑里面已经装好了python3.5 安装Selenium pip3 install selenium 安装Phantomjs 按照系统

python --selenium+phantomjs爬取动态页面广告源码

背景:利用爬虫,爬取网站页面广告元素,监控爬取元素的数目,定时发送监控邮件 #!/usr/bin/env python2.7 # -*- coding: utf-8 -*- ''' @xiayun @[email protected] #爬取网站内容,利用phantomjs:IP代理+修改UA+动态页面执行JS ''' from selenium import webdriver from selenium.webdriver.common.desired_capabilities import

Python爬取CSDN专家博客系类——移动开发

文章分为两部分:爬取移动开发专家的姓名和博客首页地址,爬取每个专家的所有博客存放在已该专家名字命名的txt文件中 说明:本爬虫主要是采用BeautifulSoup和少量的正则匹配,在第一部分抓取完毕后需要将文件格式改为ANSI,代码如下: 第一部分: 第二部分: 结果如下图: 版权声明:本文为博主原创文章,未经博主允许不得转载.

通过urllib.request爬取CSDN原创博客标题方法封装

通过urllib.request爬取CSDN博客原创博客标题方法封装 正则表达式:pat = '<span class=".*">原创</span>(.*)</a>' import re import urllib.request def get_csdn(url, pat, page): title_list = [] for page1 in range(1, int(page) + 1): new_url = url + str(page1)

爬取廖雪峰博客

#https://zhuanlan.zhihu.com/p/26342933 scrapy startproject liaoxuefeng cd liaoxuefeng # pycharm中新建并导入工程#讲解scrapy基本架构及文件用处 引擎从调度器中取出一个链接(URL)用于接下来的抓取    引擎把URL封装成一个请求(Request)传给下载器    下载器把资源下载下来,并封装成应答包(Response)    爬虫解析Response    解析出实体(Item),则交给实体管道

[python爬虫] Selenium定向爬取虎扑篮球海量精美图片

前言: 作为一名从小就看篮球的球迷,会经常逛虎扑篮球及湿乎乎等论坛,在论坛里面会存在很多精美图片,包括NBA球队.CBA明星.花边新闻.球鞋美女等等,如果一张张右键另存为的话真是手都点疼了.作为程序员还是写个程序来进行吧!        所以我通过Python+Selenium+正则表达式+urllib2进行海量图片爬取.        前面讲过太多Python爬虫相关的文章了,如爬取新浪博客.维基百科Infobox.百度百科.游迅网图片,也包括Selenium安装过程等等,详见我的两个专栏: 

[python爬虫] Selenium定向爬取PubMed生物医学摘要信息

本文主要是自己的在线代码笔记.在生物医学本体Ontology构建过程中,我使用Selenium定向爬取生物医学PubMed数据库的内容.        PubMed是一个免费的搜寻引擎,提供生物医学方面的论文搜寻以及摘要.它的数据库来源为MEDLINE(生物医学数据库),其核心主题为医学,但亦包括其他与医学相关的领域,像是护理学或者其他健康学科.它同时也提供对于相关生物医学资讯上相当全面的支援,像是生化学与细胞生物学.        PubMed是因特网上使用最广泛的免费MEDLINE,该搜寻引

[python] 常用正则表达式爬取网页信息及分析HTML标签总结【转】

[python] 常用正则表达式爬取网页信息及分析HTML标签总结 转http://blog.csdn.net/Eastmount/article/details/51082253 标签: pythonpython爬虫正则表达式html知识总结 2016-04-07 06:13 3615人阅读 评论(4) 收藏 举报  分类: Python爬虫(23)  Python基础知识(17)  版权声明:本文为博主原创文章,转载请注明CSDN博客源地址!共同学习,一起进步~ 这篇文章主要是介绍Pytho

[python学习] 简单爬取维基百科程序语言消息盒

文章主要讲述如何通过Python爬取维基百科的消息盒(Infobox),主要是通过正则表达式和urllib实现:后面的文章可能会讲述通过BeautifulSoup实现爬取网页知识.由于这方面的文章还是较少,希望提供一些思想和方法对大家有所帮助.如果有错误或不足之处,欢迎之处:如果你只想知道该篇文章最终代码,建议直接阅读第5部分及运行截图. 一. 维基百科和Infobox 你可能会疑惑Infobox究竟是个什么东西呢?下面简单介绍. 维基百科作为目前规模最大和增长最快的开放式的在线百科系统,其典型