Python 循环浏览Grand漫画书数据库上的URL列表

Python 循环浏览Grand漫画书数据库上的URL列表,python,browser,Python,Browser,我最近一直在尝试手工完成以下工作,我想知道是否有一种快速的方法来实现自动化。我唯一的经验就是在Ubuntu的终端上玩python/python3,这就是为什么我希望用python而不是其他语言来做这件事 一些背景:my.comics.org网站是一个漫画书数据库,其中给定的问题有一个https://my.comics.org/issue/#其中#是一些数字。如果有人登录到某个帐户,则会有一个“添加”按钮将问题添加到所选列表中。我正在尝试拼凑一个脚本,该脚本将循环遍历对应于数字范围的URL,并将每

我最近一直在尝试手工完成以下工作,我想知道是否有一种快速的方法来实现自动化。我唯一的经验就是在Ubuntu的终端上玩python/python3,这就是为什么我希望用python而不是其他语言来做这件事

一些背景:my.comics.org网站是一个漫画书数据库,其中给定的问题有一个
https://my.comics.org/issue/#
其中
#
是一些数字。如果有人登录到某个帐户,则会有一个“添加”按钮将问题添加到所选列表中。我正在尝试拼凑一个脚本,该脚本将循环遍历对应于数字范围的URL,并将每个问题添加到所选列表中。选择列表保存在浏览器中,因此无需指定,因此只需单击按钮即可。检查“添加”按钮,html中有以下行

<input type="submit" name="confirm_selection" value="Add">`
这打开了一堆标签,但我有几个错误,比如

Unable to open /var/lib/snapd/desktop/dconf/profile/user: Permission denied

我也不想同时打开所有选项卡,因为我想在一系列(比如)1000个问题上运行脚本。有没有一个简单的方法可以做到这一点?谢谢。

有一些空闲时间,所以我在my.comics.org上建立了一个帐户

我不会为此使用
webbrowser
模块。相反,我将使用
请求
模块。使用
请求
,您可以向网站发出HTTP GET和POST请求(以及其他一些请求)。其思想是创建一个请求负载,并将其提交到所需的URL,以便或多或少地模拟将在浏览器中执行的“操作”。最困难的部分是使您的请求格式良好,并知道如何放入请求中,以便接收服务器能够接受它们

下面是我想到的代码(注意,我在几个地方使用了f-strings,这是Python 3.6的一个特性。如果没有f-strings,可以只使用普通的字符串格式):

一些注意事项:

第一步是创建请求会话,就像浏览器在您访问网站时为您创建会话一样。接下来我们要做的是登录我们的帐户。为此,我们需要一个“用户名”(电子邮件)和密码。我们还需要一个称为CSRF令牌的东西,它是服务器发送给您的一次性cookie,用于唯一标识您的会话。我们的设置方法是创建一个字典,将“用户名”映射到您的电子邮件,“密码”映射到您的密码等。我们几乎准备好提交我们的第一个POST请求,但您还必须向服务器提供一个标题,其中描述了您的客户机和您的来源(服务器通常也希望看到这一点,以确保您的请求是真实的)

在我们的第一次POST请求之后,我们现在应该登录(注意,与webbrowser模块不同,所有这些都不会打开任何选项卡或浏览器实例。这一切都是在幕后发生的)。登录后,我们可以反复讨论我们感兴趣添加到集合中的问题

请注意,对于我的集合\u id,我选择了值“27402”。您可能必须更改此值,因为这是我的集合的id(我为这个项目制作了一个“python集合”)。我计算我要添加到的集合id的方法是通过查看HTML:

<form method="POST" action="/issue/41485/add_to_collection/">
  <input type='hidden' name='csrfmiddlewaretoken' value='REDACTED, NORMALLY A BUNCH OF RANDOM CHARACTERS' />
  <div>

    <input type="submit" name="confirm_selection" value="Add">
    this issue to your 
    <select name="collection_id">

      <option value="27400" >Default have collection

      <option value="27401" >Default want collection

      <option value="27402" >python collection

    </select>
  </div>
</form>
并且,在浏览器中登录我的帐户后,我的漫画集:

哇,太感谢了。我不知道该怎么做。我很感激这些笔记对正在发生的事情做了一些解释。这对像我这样有兴趣了解正在发生的事情的人来说是很有帮助的,但她完全不懂。当然。如果你有任何问题,请告诉我。
def main():
    import requests

    login_url = "https://my.comics.org/accounts/login/"

    client = requests.session()

    # First, get the CSRF token.
    client.get(login_url)
    csrf_token = client.cookies["csrftoken"]


    email = "YOUR EMAIL GOES HERE"
    password = "YOUR PASSWORD GOES HERE"

    credentials = {
        "username": email,
        "password": password,
        "csrfmiddlewaretoken": csrf_token,
        "next": "/"
        }

    headers = {
        "User-Agent": "User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36",
        "Referer": login_url,
        "Connection": "keep-alive",
        "Host": "my.comics.org",
        "Origin": "https://my.comics.org"
        }

    request = client.post(login_url, data=credentials, headers=headers)

    # We should be logged in now.
    # Here is where we can start adding the issues to our desired collection(s).

    issue_numbers = [41485, 41486, 41487]
    collection_id = "27402"

    number_of_issues = len(issue_numbers)

    for issue_index, issue_number in enumerate(issue_numbers):
        issue_url = f"https://my.comics.org/issue/{issue_number}/add_to_collection/"

        # Get the CSRF token again.
        client.get(issue_url)
        csrf_token = client.cookies["csrftoken"]

        data = {
            "csrfmiddlewaretoken": csrf_token,
            "confirm_selection": "Add",
            "collection_id": collection_id,
            }

        headers["Referer"] = issue_url

        print(f"({issue_index+1}/{number_of_issues}) Adding issue# {issue_number} to collection# {collection_id}...")
        request = client.post(issue_url, data=data, headers=headers)

    print("All done!")

    return 0

if __name__ == "__main__":
    import sys
    sys.exit(main())
<form method="POST" action="/issue/41485/add_to_collection/">
  <input type='hidden' name='csrfmiddlewaretoken' value='REDACTED, NORMALLY A BUNCH OF RANDOM CHARACTERS' />
  <div>

    <input type="submit" name="confirm_selection" value="Add">
    this issue to your 
    <select name="collection_id">

      <option value="27400" >Default have collection

      <option value="27401" >Default want collection

      <option value="27402" >python collection

    </select>
  </div>
</form>
(1/3) Adding issue# 41485 to collection# 27402...
(2/3) Adding issue# 41486 to collection# 27402...
(3/3) Adding issue# 41487 to collection# 27402...
All done!