首页 > 解决方案 > 使用 Python 3 登录和 Web 抓取,但 action='#' 可能还有 Java 脚本

问题描述

我正在尝试使用 Python 3 使用 Beautifulsoup 和 Mechanicalsoup 从 Ancestry.com 抓取我的数据,但我在尝试登录时遇到了一些问题。这是 Ancestry 上的表单 HTML:

<form action="#" id="signInForm" method="post" class="form formLarge" onsubmit="return false" novalidate="novalidate" data-ui-id="ui1591467547206308">
            <div class="ancGrid">
                <div class="ancCol ancColRow w100">
                    <label id="usernameLabel" for="username" data-error-0="Required" data-error-1="Please enter a minimum of 5 characters for the username/email" data-error-2="Username/email contains invalid characters">
                        Email or Username
                    </label>
                    <input tabindex="1" aria-required="true" class="success required" id="username" maxlength="64" name="username" placeholder="Email Address or Username" type="text" value="" autocorrect="off" autocapitalize="off">
                </div>
                <div class="ancCol ancColRow w100">
                    <label id="passwordLabel" for="password" data-error-0="Required" data-error-1="Please enter a minimum of 5 characters for the password" data-error-2="Password contains invalid characters">
                        Password
                    </label> [event]
  1. 该站点的 HTML 表单使用 action='#',我发现这意味着将输入提交到当前网页。此外,我看到一个[event],它指出“事件侦听器”,我认为这意味着 Java Script?如果是这样,我是否需要单独的导入工具才能登录?
  2. Beautifulsoup 找不到第一种形式(两种形式)。第二种形式有 action="" 确实出现了。

    from urllib.request import urlopen
    # specify the url
    quote_page = 'https://www.ancestry.com/account/signin?'
    # query the website and return the html to the variable ‘page’
    page= urlopen(quote_page)
    
    # parse the html using beautiful soup and store in variable `soup`
    soup = BeautifulSoup(page, 'html.parser')
    len(soup.find_all('form')) #Out: 1
    
  3. 如何与表格 1 互动?当我使用时,browser.select_form('form[action="#"]')我收到错误 LinkNotFoundError。我的代码:

#import urllib.request
#import time
#pip install beautifulsoup4
#from bs4 import BeautifulSoup
#%pip install mechanicalsoup
#import mechanicalsoup

browser = mechanicalsoup.StatefulBrowser()
browser.open('https://www.ancestry.com/account/signin?')
print(browser.get_url())

#browser.select_form('')
###action="#" id="signInForm"
#browser.select_form('form[action="#" id="signInForm"]')
#browser.select_form('form[action="#"]')   #gives LinkNotFound error
browser.select_form('form[action=""]')


browser['username']='USERNAME'
browser['password']='PASSWORD'

browser.submit_selected()
print(browser.get_url())

我看到很多使用 mechanize 的支持,但这不适用于 Python 3。我不知道如何检查 Ancestry.com 是否使用 Java,因为我无法使用第一种形式。我是初学者,所以请假设我什么都不知道,我不会被冒犯。(我还没有找到 action='#' 的教程,因为该查询返回的结果很少)

(此人使用不同的策略登录 Ancestry,但自从发布此代码后网站已更新https://github.com/freeseek/getmydnamatches/blob/master/getmyancestrydna.py他的代码对我来说有点太高级了,在我的水平。)

标签: javascriptpythonweb-scrapingbeautifulsoupmechanicalsoup

解决方案


请考虑看看这个: https ://requests.readthedocs.io/projects/requests-html/en/latest/

它非常友好并且支持javascript。


推荐阅读