我正在使用Python 3作为脚本,该脚本将监视用户在网页上的个人资料中的更新.登录此站点受CSRF对策的保护,这是一件好事.但是,我无法让我的脚本登录此站点.
我的方法使用mechanicalsoup:
import mechanicalsoup
browser = mechanicalsoup.Browser()
login_page = browser.get(base_url)
login_form = login_page.soup.select(".form-signin")[0]
login_form.find(attrs={"name": "username"})['value'] = 'username'
login_form.find(attrs={"name": "password"})['value'] = 'password'
page2 = browser.submit(login_form, login_url)
print(str(page2.text))
Run Code Online (Sandbox Code Playgroud)我的方法使用robobrowser:
import re
from robobrowser import RoboBrowser
browser = RoboBrowser(history=True)
browser.open(base_url)
form = browser.get_form(action='/login/')
form["username"] = 'username'
form["password"] = 'password'
browser.submit_form(form)
print(str(browser.select))
Run Code Online (Sandbox Code Playgroud)在这两种情况下,我最终得到HTTP状态403和消息说CSRF verification failed. Request aborted.
mechanicalsoup并且robobrowser也会提交此输入.我对吗?或者我必须特别对待它?我已经搜索了所有 Mechanicalsoup 和 beautifulsoup 文档,但无法弄清楚如何使用“id”设置表单元素的值(因为它没有名称)。
import mechanicalsoup
browser = mechanicalsoup.StatefulBrowser()
browser.open(my_url)
form = browser.select_form('form[id="login-form"]')
browser.get_current_form().print_summary()
userid = browser.get_current_page().find('input', id='text-userid')
form.set("text-userid", "user")
Run Code Online (Sandbox Code Playgroud)
这让我——
<input class="login-text-box" id="text-userid" placeholder="Email" type="text" value=""/>
<input class="login-text-box" id="text-password" placeholder="Password" type="password" value=""/>
<input id="button-login" type="submit" value="Sign In"/>
<input id="remember-me-checkbox" name="rememberme" type="checkbox" value="rememberme"/>
LinkNotFoundError: No valid element named text-userid
Run Code Online (Sandbox Code Playgroud)
我曾尝试通过 id、CSS 选择器和其他组合引用元素,但得到相同的错误。我能够通过以下方式获取实际标签(我发现它是提交按钮类似问题的解决方案):
userid = browser.get_current_page().find('input', id='text-userid')
Run Code Online (Sandbox Code Playgroud)
但 form.set() 不直接接受标签。
谢谢你的帮助!
html页面中有一个下拉列表.我需要在Python中使用mechanicalsoup来设置我想要的值.我尝试了这个,但它没有用.如果有可能(我希望)我如何在组合框中设置一个值.还有另一个组合框(名为combo2).Combo2的值取决于Combo1的值.Combo1刷新Combo2.
import mechanicalsoup
browser = mechanicalsoup.Browser()
url = 'https://www.webpage.com/main.jsp?page=Page2'
login_page = browser.get(url)
form = mechanicalsoup.Form(login_page.soup.find("form", {"name":"Form2"}))
input_data = {"Combo1": "02"}
<select name="Combo1" id="Combo1" onchange="fillMe('idoof', 'cName')" class="test">
<option value="">Select</option>
<option value="01">Apple</option>
<option value="02">Orange</option>
<option value="03">WaterMelon</option>
<option value="04">Grapefruit</option>
<option value="05">Pineapple</option>
<option value="06">Salad</option>
<option value="07">Tomato</option>
<option value="08">Beet</option>
</select>
Run Code Online (Sandbox Code Playgroud) 我可以成功登录并浏览网站,但是当我检查注销按钮时,它就像javascript:__doPostBack('ctl00$lnkBtnLogout','')链接一样,follow_link()不起作用(说:没有适配器)???有人能帮我吗?
我想在登录页面后面抓取一些信息,但得到503
当我尝试使用Mechanicalsoup登录时(与robobrowser的结果相同),将发生以下情况:
>>> import mechanicalsoup
>>> browser = mechanicalsoup.StatefulBrowser(user_agent='Mozilla/5.0')
>>> page = browser.get('https://X.com')
>>> page.status_code
200
>>> page = browser.get('https://X.com/wp-login.php')
>>> page.status_code
503
Run Code Online (Sandbox Code Playgroud)
我尝试了几个不同的user_agents,如何解决呢?移动饼干?
我有广告拦截规则列表(示例)
如何将它们应用到网页?我使用 MechanicalSoup(基于 BeautifulSoup)下载网页代码。我想将其保存为 bs 格式,但 etree 也可以。
我尝试使用以下代码,但某些页面存在问题:
ValueError: Unicode strings with encoding declaration are not supported. Please use bytes input or XML fragments without declaration.
beautifulsoup adblock web-scraping python-3.x mechanicalsoup