Python scrapy+selenium登录你的CSDN账号,然后去给别人点关注
Posted bbb001
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
以上是关于Python scrapy+selenium登录你的CSDN账号,然后去给别人点关注 的主要内容,如果未能解决你的问题,请参考以下文章
Python scrapy+selenium登录你的CSDN账号,然后去给别人点关注 -- 2019-08-08 20:39:43
Python scrapy+selenium登录你的CSDN账号,然后去给别人点关注 -- 2019-08-11 18:44:20
在与 Scrapy 进行身份验证的登录会话后使用 Selenium