1、重复重新登录,过程麻烦
2、拖慢爬虫的运行速度
3、容易让网站检测到账号异常
如何解决重复登录的问题
1、使用登录过的cookie,下次运行时设置保存
2、接管打开的浏览器,也是我们接下来重点讲的
Chrome浏览器是支持远程调试模式的。这个模式打开的情况下,Puppeteer或者Selenium可以通过websocket连上去,进而控制它。
下面氛围启动浏览器和启动爬虫接管两部分
启动Chrome的远程调试端口
第一步:你需要找到Chrome的安装位置,在Chrome的地址栏输入chrome://version就能找到Chrome的安装路径,如下图所示:

找到路径后,先创建一个空白的文件夹,后面需要存放打开远程浏览器的内容。
第二步:执行命令启动支持远程调试功能的Chrome【启动后不要关闭!】
以windows系统为例:键盘同时按下:windows旗帜键+R,调出运行,然后输入:cmd,回车调出命令提示框,然后之下面命令。
windows系统命令:
文件路径/chrome.exe --remote-debugging-port=9222 --user-data-dir="某个空白文件夹地址"
参数说明:
--remote-debugging-port:可以指定任意可使用的端口
--user-data-dir:指定创建新的chrome配置目录,作用是防止污染默认配置
注意:如果路径中含有空格,在下面命令使用的时候会有问题,因为命令是不能有空格
【解决方法:】在文件中直接打开该路径,然后在路径输入栏里面输入:cmd,然后回车,就能调出该目录下的命令提示框。同时命令也被简化成:chrome.exe --remote-debugging-port=9222 --user-data-dir="某个空白文件夹地址"
mac系统命令:
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" --remote-debugging-port=9222 --no-first-run --no-default-browser-check --user-data-dir=$(mktemp -d -t 'chrome-remote_data_dir')
注意:由于地址中有空格,所以要把可执行文件的路径用引号抱起来。

第三步:手动新开一个浏览器,并访问下面地址
http://127.0.0.1:9222/json/version
访问地址后,我们可以看到一段json信息,记住最下方的webSocketDebuggerUrl,这个就是我们后面需要远程访问的链接。

ws://127.0.0.1:9222/devtools/browser/d1f5ebaf-ae68-4057-91db-cd8e2df81f68(以实际为准)。
通过上面的步骤,我们成功启动Chrome并开放9222端口,下面我们通过代码来实现控制刚才已打开的chrome浏览器访问我们的目标网址。
from selenium.webdriver import Chrome
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
driver = Chrome(
service=Service(r'D:\software\PyCharmLib\chromedriver.exe'),
options=chrome_options)
# 注意:把chromedriver文件放到了当前文件夹里面,可以这样调用
# driver = Chrome('./chromedriver.exe', options=chrome_options)
driver.get('https://blog.csdn.net/HRG520JN/article/details/125936986')
http_str = input('输入任意地址,无则回车')
if http_str:
http_str = http_str
else:
http_str = 'https://blog.csdn.net/HRG520JN/article/details/125781184'
driver.get(http_str)
http_str2 = input('输入任意内容地址,无则回车查看selenium全面讲解文章')
if http_str2:
http_str2 = http_str2
else:
http_str2 = 'https://blog.csdn.net/HRG520JN/article/details/125781184'
driver.get(http_str2)
为了证明确实有效控制,我在上面代码加入了本人的博客文章地址,如果有内容输入则访问,无则访问selenium文章讲解。
因为很多政务系统都是需要ie或者edge浏览器操作,前期需要人工手动打开各种安全控制软件,如果通过自动化主动打开浏览器是无法打开那些系统的,所以前期就需要先人工操作再由selenium接管IE浏览器来实现。
通过第一次打开ie浏览器,然后将其session_id和地址保存在本地session.ini文件中。
CreateSession.py
import sys
import configparser
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
sys.path.append("..")
# 这里是自己下载的ie驱动
iedriver = Service('D:\software\PyCharmLib\IEDriverServer.exe')
driver = webdriver.Ie(service=iedriver)
url = driver.command_executor._url
session_id=driver.session_id
print(driver.session_id)
print(driver.command_executor._url)
config = configparser.ConfigParser()
config.add_section("IE")
config.set("IE", "url", url)
config.set("IE", "session_id", session_id)
with open("session.ini", "w+") as f:
config.write(f)
f.close()
运行后,会在同目录下生成一个session.ini文件,里面内容如下:
ReuseIe.py,这里不用运行,将由下面接管的时候引用处理
from selenium.webdriver import Remote
class ReuseIe(Remote):
def __init__(self, command_executor, session_id):
self.r_session_id = session_id
Remote.__init__(self, command_executor=command_executor, desired_capabilities={})
def start_session(self, desired_capabilities, browser_profile=None):
capabilities = {'desiredCapabilities': {}, 'requiredCapabilities': {}}
for k, v in desired_capabilities.items():
if k not in ('desiredCapabilities', 'requiredCapabilities'):
capabilities['desiredCapabilities'][k] = v
else:
capabilities[k].update(v)
if browser_profile:
capabilities['desiredCapabilities']['firefox_profile'] = browser_profile.encoded
self.session_id = self.r_session_id
# self.capabilities = options.Options().to_capabilities()
self.w3c = False
useie.py
import sys
import configparser
from ReuseIe import *
sys.path.append("..")
config = configparser.ConfigParser()
config.read("session.ini", encoding="utf-8")
url = config.get("IE", "url")
session_id = config.get("IE", "session_id")
print(session_id)
print(url)
driver = ReuseIe(url, session_id)
driver.get("https://www.csdn.net")
运行useie.py后我们会发现,没有新增ie浏览器,使用的就是刚才我们打开的浏览器,在实际应用中,根据业务再自行封装起来使用,思路是提供一个运行文件让操作员点击,先启动ie浏览器,然后再启动咱们的核心程序就可以了。

如果对selenium chrome、ie浏览器驱动不懂的,可以看下这篇文章的第2点 安装浏览器驱动 或者学习下有关于selenium基础。
学习过程中有什么问题,欢迎下方评论交流。
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
当我在Rails控制台中按向上或向左箭头时,出现此错误:irb(main):001:0>/Users/me/.rvm/gems/ruby-2.0.0-p247/gems/rb-readline-0.4.2/lib/rbreadline.rb:4269:in`blockin_rl_dispatch_subseq':invalidbytesequenceinUTF-8(ArgumentError)我使用rvm来管理我的ruby安装。我正在使用=>ruby-2.0.0-p247[x86_64]我使用bundle来管理我的gem,并且我有rb-readline(0.4.2)(人们推荐的最少
我正在使用Ruby2.1.1和Rails4.1.0.rc1。当执行railsc时,它被锁定了。使用Ctrl-C停止,我得到以下错误日志:~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`gets':Interruptfrom~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`verify_server_version'from~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.
我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新rubygems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems
我正在尝试在Ruby中制作一个cli应用程序,它接受一个给定的数组,然后将其显示为一个列表,我可以使用箭头键浏览它。我觉得我已经在Ruby中看到一个库已经这样做了,但我记不起它的名字了。我正在尝试对soundcloud2000中的代码进行逆向工程做类似的事情,但他的代码与SoundcloudAPI的使用紧密耦合。我知道cursesgem,我正在考虑更抽象的东西。广告有没有人见过可以做到这一点的库或一些概念证明的Ruby代码可以做到这一点? 最佳答案 我不知道这是否是您正在寻找的,但也许您可以使用我的想法。由于我没有关于您要完成的工作
我的主要目标是能够完全理解我正在使用的库/gem。我尝试在Github上从头到尾阅读源代码,但这真的很难。我认为更有趣、更温和的踏脚石就是在使用时阅读每个库/gem方法的源代码。例如,我想知道RubyonRails中的redirect_to方法是如何工作的:如何查找redirect_to方法的源代码?我知道在pry中我可以执行类似show-methodmethod的操作,但我如何才能对Rails框架中的方法执行此操作?您对我如何更好地理解Gem及其API有什么建议吗?仅仅阅读源代码似乎真的很难,尤其是对于框架。谢谢! 最佳答案 Ru
本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决
说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时
我有一个使用SeleniumWebdriver和Nokogiri的Ruby应用程序。我想选择一个类,然后对于那个类对应的每个div,我想根据div的内容执行一个Action。例如,我正在解析以下页面:https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=puppies这是一个搜索结果页面,我正在寻找描述中包含“Adoption”一词的第一个结果。因此机器人应该寻找带有className:"result"的div,对于每个检查它的.descriptiondiv是否包含单词“adoption
在我的Character模型中,我添加了:字符.rbbefore_savedoself.profile_picture_url=asset_path('icon.png')end但是,对于数据库中已存在的所有角色,它们的profile_picture_url为nil。因此,我想进入控制台并遍历所有这些并进行设置。在我试过的控制台中:Character.find_eachdo|c|c.profile_picture_url=asset_path('icon.png')end但这给出了错误:NoMethodError:undefinedmethod`asset_path'formain:O