【Python scrapy+selenium】登录你的CSDN账号,然后去给别人点关注 𳲁

时间:2019-08-24
本文章向大家介绍【Python scrapy+selenium】登录你的CSDN账号,然后去给别人点关注 𳲁,主要包括【Python scrapy+selenium】登录你的CSDN账号,然后去给别人点关注 𳲁使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

原文: http://blog.gqylpy.com/gqy/371

你别搞混了,这里是用自己的账号给别人点关注,你要是想刷关注量,就看别人回不回你了。

爬虫文件

import scrapy
import os
import re
import json
from selenium import webdriver  # pip install selenium
from selenium.webdriver.chrome.options import Options  # 谷歌无头浏览器(就是后台运行)
# 关于selenium的详细用法:https://blog.csdn.net/qq_41964425/article/details/86239118


class Blog01Spider(scrapy.Spider):
    name = 'blog01'

    # 起始url列表
    start_urls = ['https://www.csdn.net/nav/']

    # url匹配规则,用于获取起始url页面中所有文章的链接,实际上我们只提取了用户名(\w+)
    rule_url = r'https://blog.csdn.net/(\w+)/article/details/\d+'

    # 哈哈,这个是点击关注按钮时访问的url
    haha_url = 'https://my.csdn.net/index.php/follow/do_follow'

    # cookies将在下载中间件中传入
    cookies = None
    # 这里的cookies用于标识用户登录状态,你想想啊,你不登录 怎么关注别人啊

    # 用于统计你此次关注了多少人
    count = 0

    # 用于存放已关注用户的文件
    file_name = 'ok_user'
    # 保存已关注用户的目的是为了,再次运行时过滤掉已关注的用户,避免发送大量不必要的关注请求


    def __init__(self):
        # 打开谷歌浏览器
        self.bro = webdriver.Chrome(executable_path=r'chromedriver.exe')

        # 你也可以使用谷歌无头浏览器,步骤如下:
        # chrome_options = Options()
        # chrome_options.add_argument('--headless')
        # chrome_options.add_argument('--disable-gpu')
        # self.bro = webdriver.Chrome(executable_path=r'chromedriver.exe', chrome_options=chrome_options)

        # 打开用于存放已关注用户的文件
        if os.path.exists(self.file_name):
            with open(self.file_name, 'r', encoding='utf-8') as f:
                self.ok_user = set(json.loads(f.read()))
        else:
            self.ok_user = set()
        # 第一次运行时,将走else的逻辑


    # 重写父类方法,用于关闭浏览器,和持久化存储已关注用户
    def closed(self, spider):
        """该方法会在爬虫结束时执行"""
        self.bro.quit()

        # 将执行过程中关注的用户添加到已关注用户列表中,并进行持久化存储
        self.ok_user.update(self.user_list)
        with open(self.file_name, 'w', encoding='utf-8') as f:
            f.write(json.dumps(list(self.ok_user)))
        # 持久化存储用于再次运行时过滤掉已关注的用户,避免发送不必要的请求


    def parse(self, response):
        # 获取页面内容
        str_body = response.body_as_unicode()

        # 开始提取符合url规则的用户名,注意去重
        user_list = set(re.findall(self.rule_url, str_body))

        # 过滤已关注的用户,取差集
        self.user_list = user_list - self.ok_user

        # 下面将关注过滤后的用户
        for user in self.user_list:
            yield scrapy.FormRequest(url=self.haha_url, formdata={'username': user}, cookies=self.cookies,
                                     meta={'user': user}, callback=self.parse_haha_page)
            # scrapy.FormRequest():发送post请求
                # formdata:指定请求的参数
                # cookies:携带cookies,证明你已经登录了
                # meta={'user': user}:请求传参,向下面的解析方法传数据


    # 成功发送关注请求后,将在这里得到相应
    def parse_haha_page(self, response):
        # 它返回的是JSON数据
        res = json.loads(response.body_as_unicode())

        # 你可以这样获取传过来的参数
        user = response.meta.get('user')

        # 判断是否关注成功
        if res.get('succ') is 1:
            self.count += 1
            print(f'\r共计关注了 {self.count} 人!', end='')

中间件文件

from scrapy.http import HtmlResponse  # 用于生成响应对象
from time import sleep


# 下载中间件
class BlogDownloaderMiddleware(object):

    # 这个是用于QQ登录CSDN的url,登录后将自动跳转至CSDN首页
    login_url = 'https://graph.qq.com/oauth2.0/show?which=Login&display=pc&client_id=100270989&response_type=code&' \
                'redirect_uri=https%3A%2F%2Fpassport.csdn.net%2Faccount%2Flogin%3FpcAuthType%3Dqq%26state%3Dtest'
    # 这里仅限于QQ登录


    def process_response(self, request, response, spider):
        """
        此方法用于拦截响应,我们将在这里拦截起始url的响应
        :param request: 当前响应对象的请求
        :param response: 响应
        :param spider:爬虫类对象
        :return:
        """

        # 如果不是起始url页面的响应,则直接放行:
        if request.url not in spider.start_urls: 
            return response


        # 能走到这里的必然是起始url页面的响应,下面将篡改响应对象

        # 获取在爬虫类中创建好的浏览器对象
        bro = spider.bro
        
        # 向登录页面发起get请求
        bro.get(url=self.login_url)


        # 开始操作浏览器:

        # 定位到指定的iframe
        bro.switch_to.frame('ptlogin_iframe')
        # 因为QQ登录CSDN的页面是多个页面合成的,因此我们要定位到具体要操作的页面上
        # 我们这里定位的iframe就是填写QQ账号密码的那个小框框

        # 点击 使用账号密码登录
        bro.find_element_by_id('switcher_plogin').click()

        # 填写QQ账号和密码并点击登录按钮,登录成功后将返回CSDN首页
        bro.find_element_by_id('u').send_keys('你的QQ账号')
        bro.find_element_by_id('p').send_keys('你的QQ密码')
        bro.find_element_by_id('login_button').click()
        sleep(3)  # 等待页面加载,如果下一步出错,请增加等待时间

        # 切换文章分类,指定其中一种即可
        bro.find_element_by_xpath('//*[@id="nav"]/div/div/ul/li[7]/a').click()  # 编程语言
        # bro.find_element_by_xpath('//*[@id="nav"]/div/div/ul/li[11]/a').click()  # 运维
        # bro.find_element_by_xpath('//*[@id="nav"]/div/div/ul/li[14]/a').click()  # 云计算/大数据


        # 把网页往下拉,用于获取更多内容(用户),连拉20次
        js = 'window.scrollTo(0, document.body.scrollHeight);'
        for i in range(20):
            bro.execute_script(js)
            sleep(0.3)  # 等待页面加载


        # 将登录成功后,服务器下发的cookies存入爬虫类对象,用于标识用户已登录
        spider.cookies = bro.get_cookies()
        # 这一步骤非常重要,如果你没有cookies,服务器就会认为你未登录,你就关注不了别人


        # 创建一个新的响应对象,并将动态加载到的数据存入该对象中,最后返回该对象
        return HtmlResponse(url=bro.current_url, body=bro.page_source, encoding='utf-8', request=request)
        # bro.current_url:请求的url
        # bro.page_source:页面源码,这里有我们动态加载的数据

配置文件

BOT_NAME = 'blog'

SPIDER_MODULES = ['blog.spiders']
NEWSPIDER_MODULE = 'blog.spiders'


# 伪装请求载体身份(UA)
USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.87 Safari/537.36'

# 是否遵守robots协议
ROBOTSTXT_OBEY = False

# 日志等级
LOG_LEVEL = 'ERROR'

# 并发线程数
CONCURRENT_REQUESTS = 32

# 启用下载中间件
DOWNLOADER_MIDDLEWARES = {
   'blog.middlewares.BlogDownloaderMiddleware': 543,
}

原文: http://blog.gqylpy.com/gqy/371

原文地址:https://www.cnblogs.com/mypath1/p/11405328.html