在循环中第二次调用“ driver.get(url)”后,Selenium出现“错误:已超过最大重试次数”,其中“ url”的值每次迭代都会更改

时间:2019-03-14 21:07:23

标签: python selenium web-scraping python-requests web-crawler

GITHUB链接到脚本

https://github.com/Lexszin/learning-stuff/blob/master/Python/Web%20Crawling/Mangadex_downloader/main.py

问题描述

基本上,我制作了一个脚本,可以从https://mangadex.org下载漫画图像。

该脚本在技术上可以正常运行,但是在第二次迭代开始时通过循环返回“ Max Retries Exceed”(超过最大重试次数)...这对我来说没有意义,因为该URL在每次迭代中都会更新,并且只会被调用一次,一次只调用一次,怎么会有多次重试?

问题似乎不在于客户端,但也不是服务器端,因为图像在第一次迭代中就可以很好地下载,但这很奇怪...

以下是脚本中执行的步骤:

  1. https://mangadex.org/检索所有现有标题,存储在“ index.json”中,如果“ index.json”已经存在,则加载文件。 (工作中)

  2. 解析从Myanimelist导入的“ .xml”文件,并从中返回所有漫画标题。 (工作中)

  3. 浏览“ index.json”和已粘贴的“ .xml”文件中的所有标题。 (工作中)

  4. 为每个漫画创建一个带有标题的目录,通过请求获取标题主页的源代码,并查找有多少页。 (工作中)

  5. 浏览每个页面,对于每个页面,获取英语或葡萄牙语漫画的所有漫画标题及其链接。 (工作中)

  6. 从标题的首页抓取数据后,循环浏览章节标题及其URL的压缩实例。 (工作中)

  7. 在manga目录中创建一个目录,命名为当前迭代/章节(1、2、3等)。在新创建的文件夹中,创建一个名为“ EN”的文件夹(仅存储英语章节)。在新创建的“ EN”文件夹中,创建一个带有实际章节名称的文件夹。 (使用章节名称创建文件夹的原因是因为有时某些特定语言缺少章节,如果我使用迭代文件夹的编号来了解当前章节,则我将处于正确的迭代中,但可能不在正确的迭代中正确的章节。)(工作)

  8. 对于当前标题的每个章节链接,请使用Selenium的chrome webdriver转到其第一页。 (内容以JavaScript呈现)(工作)

  9. 在第一章的页面中,获取该章中有多少页。将最后一页(包括最后一页)范围内的每个图像下载到新创建的Chapter文件夹中。

  10. 就是这样。然后,循环在下一章重新开始。完成当前标题的所有章节后,新的循环将以新的漫画开始。

它确实可以正常工作...

但是,在第一个完整的循环周期(下载了当前章节的所有页面,然后遍历下一章)之后,出现了异常。每次运行脚本时,都会使用不同的IP地址和标题。 每次也完全下载指定的第一章。

从表面上看,在第一个循环之后,在Selenium加载第一章的那一行,此错误消息返回。

我有一个NordVPN订阅,因此我多次重新路由了IP,但仍然遇到相同的错误。

此外,如果图像已经下载到了应该使用的文件夹中,则脚本将跳过当前章节并开始下载下一章,因此即使不下载任何内容,我仍然会收到此错误消息。

有什么想法可能导致此问题?

错误

DevTools listening on ws://127.0.0.1:51146/devtools/browser/b6d08910-ea23-4279-b9d4-6492e6b865d0
Traceback (most recent call last):
  File "C:\Users\alexT\AppData\Local\Programs\Python\Python37\lib\site-packages\urllib3\connection.py", line 159, in _new_conn
    (self._dns_host, self.port), self.timeout, **extra_kw)
  File "C:\Users\alexT\AppData\Local\Programs\Python\Python37\lib\site-packages\urllib3\util\connection.py", line 80, in create_connection
    raise err
  File "C:\Users\alexT\AppData\Local\Programs\Python\Python37\lib\site-packages\urllib3\util\connection.py", line 70, in create_connection
    sock.connect(sa)
ConnectionRefusedError: [WinError 10061] No connection could be made because the target machine actively refused it

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\alexT\AppData\Local\Programs\Python\Python37\lib\site-packages\urllib3\connectionpool.py", line 600, in urlopen
    chunked=chunked)
  File "C:\Users\alexT\AppData\Local\Programs\Python\Python37\lib\site-packages\urllib3\connectionpool.py", line 354, in _make_request
    conn.request(method, url, **httplib_request_kw)
  File "C:\Users\alexT\AppData\Local\Programs\Python\Python37\lib\http\client.py", line 1229, in request
    self._send_request(method, url, body, headers, encode_chunked)
  File "C:\Users\alexT\AppData\Local\Programs\Python\Python37\lib\http\client.py", line 1275, in _send_request
    self.endheaders(body, encode_chunked=encode_chunked)
  File "C:\Users\alexT\AppData\Local\Programs\Python\Python37\lib\http\client.py", line 1224, in endheaders
    self._send_output(message_body, encode_chunked=encode_chunked)
  File "C:\Users\alexT\AppData\Local\Programs\Python\Python37\lib\http\client.py", line 1016, in _send_output
    self.send(msg)
  File "C:\Users\alexT\AppData\Local\Programs\Python\Python37\lib\http\client.py", line 956, in send
    self.connect()
  File "C:\Users\alexT\AppData\Local\Programs\Python\Python37\lib\site-packages\urllib3\connection.py", line 181, in connect
    conn = self._new_conn()
  File "C:\Users\alexT\AppData\Local\Programs\Python\Python37\lib\site-packages\urllib3\connection.py", line 168, in _new_conn
    self, "Failed to establish a new connection: %s" % e)
urllib3.exceptions.NewConnectionError: <urllib3.connection.HTTPConnection object at 0x000002128FCDD518>: Failed to establish a new connection: [WinError 10061] No connection could be made because the target machine actively refused it

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "c:/Programming/Python/Projects/Mangadex.downloader/main.py", line 154, in <module>
    driver.get(chapter_start_url)
  File "C:\Users\alexT\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 333, in get
    self.execute(Command.GET, {'url': url})
  File "C:\Users\alexT\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 319, in execute
    response = self.command_executor.execute(driver_command, params)
  File "C:\Users\alexT\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\remote\remote_connection.py", line 374, in execute
    return self._request(command_info[0], url, body=data)
  File "C:\Users\alexT\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\remote\remote_connection.py", line 397, in _request
    resp = self._conn.request(method, url, body=body, headers=headers)
  File "C:\Users\alexT\AppData\Local\Programs\Python\Python37\lib\site-packages\urllib3\request.py", line 72, in request
    **urlopen_kw)
  File "C:\Users\alexT\AppData\Local\Programs\Python\Python37\lib\site-packages\urllib3\request.py", line 150, in request_encode_body
    return self.urlopen(method, url, **extra_kw)
  File "C:\Users\alexT\AppData\Local\Programs\Python\Python37\lib\site-packages\urllib3\poolmanager.py", line 323, in urlopen
    response = conn.urlopen(method, u.request_uri, **kw)
  File "C:\Users\alexT\AppData\Local\Programs\Python\Python37\lib\site-packages\urllib3\connectionpool.py", line 667, in urlopen
    **response_kw)
  File "C:\Users\alexT\AppData\Local\Programs\Python\Python37\lib\site-packages\urllib3\connectionpool.py", line 667, in urlopen
    **response_kw)
  File "C:\Users\alexT\AppData\Local\Programs\Python\Python37\lib\site-packages\urllib3\connectionpool.py", line 667, in urlopen
    **response_kw)
  File "C:\Users\alexT\AppData\Local\Programs\Python\Python37\lib\site-packages\urllib3\connectionpool.py", line 638, in urlopen
    _stacktrace=sys.exc_info()[2])
  File "C:\Users\alexT\AppData\Local\Programs\Python\Python37\lib\site-packages\urllib3\util\retry.py", line 398, in increment
    raise MaxRetryError(_pool, url, error or ResponseError(cause))
urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='127.0.0.1', port=51139): Max retries exceeded with url: /session/4f72fba8650ac3ead558cb25172b4b38/url (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x000002128FCDD518>: Failed to establish a new connection: [WinError 10061] No connection could be made because the target machine actively refused it'))

目标

我正在制作一个脚本,该脚本从您导出的MyAnimeList(可能也适用于Anilist)XML列表中解析漫画标题,并下载https://mangadex.org上存在的所有列出的标题

我正在使用的模块:请求,重新,Beautiful Soup,json,os,硒,时间和urllib

请求-用于获取具有我所需信息的页面的源代码

Re-使用正则表达式解析包含在https://myanimelist.net中的漫画列表的“ .xml”文件,并在章节内更改要下载的当前图像的链接。 (链接始终以“ .jpg”或“ .png”结尾,扩展名前有一个数字,即当前页面的编号,数字前有一个随机字母)

美丽的汤-用于解析请求的响应,解析标题,标题的链接,章节标题,章节的链接等...

JSON-用于将已解析的漫画列表中的数据存储到“ index.json”并从中加载数据。

OS-用于检查文件/目录是否存在。

Selenium-仅在各章内部使用,因为读者使用JavaScript加载图像(将下载图像)以及当前章中有多少页(以此为基础循环浏览图像,例如它们具有相同的标题,唯一改变URL的是当前页面。

时间-Selenium加载章节页面后,仅使用一次,以便页面完全加载。

Urllib-用于下载章节图像。

PS-MyAnimeList和Anilist是动漫系列和漫画系列的索引,您可以在其中找到漫画和动漫系列的列表,在其中可以为列表的每个项目设置标签。 (如果您打算阅读漫画,请观看动漫,如果动漫制作完成,等等...)

1 个答案:

答案 0 :(得分:0)

我不确定这是否100%相关,但是最近我遇到了类似的错误。我发现的解决方案是无法存储cookie,因此该站点基本上是在两台服务器之间对我的请求执行ping操作,其中一台将尝试为我的浏览器分配cookie,另一台将期望该cookie,但是我的请求不会随它一起发送,因此它使我回到了服务器1。我发现解决该问题的代码是使用:

s = requests.session()
s.headers['User-Agent'] = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.131 Safari/537.36'

我认为您应该复制/粘贴以上行...我做了:)然后使用以下网址获取网址:

res = s.get(my_URL)
soup = bs4.BeautifulSoup(res.text, 'html.parser')

像这样使用request.session()可以保存cookie,然后将其发送到其他内部服务器并正确处理