【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
- Nginx|Tengine的编译安装步骤
- centos下tomcat安装调试
- Redis 实现接口访问频率限制
- Nginx 配置文件安全分析
- 一个写SQL语句的便利工具
- OpenFlow网络中的路由服务
- Python中萌新不知道的小魔法(一)
- 基于Scrapy的全球最大成人网站PornHub爬虫
- Python标准库笔记(7) — copy模块
- Python项目实战——开发网易云音乐插件
- 将已有项目代码通过命令行方式上传到github,简易傻瓜教程(图文)将已有项目代码通过命令行方式上传到github,傻瓜教程(图文)1. 创建一个github项目2. 在Repository name
- mac执行git命令出现xcrun: error: invalid active developer path解决方法
- centos修改主机名
- SSH免密登录,RSA认证登录
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 初识ABP vNext(3):vue对接ABP基本思路
- 0801-什么是Apache Ranger - 4 - Resource vs Tag Based Policies
- IDA-3D技术细节分析
- 0802-Cloudera Data Center7.1.3正式GA
- 2017,科学使用strace神器(附代码,举栗子)
- kubernete编排技术四:Job和CronJob
- Go 视图模板篇(二):模板指令
- go语言学习(五):通道的用法
- PHP无锁内存nosql---Yac的实战
- 0803-什么是Apache Ranger - 5 - Hive Plugin
- 2017年的golang、python、php、c++、c、java、Nodejs性能对比[续]
- go语言学习(四):数组和切片
- 初识ABP vNext(4):vue用户登录&菜单权限
- 2017 从上到下打印树新解法
- 基于Go的websocket消息服务