Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在web抓取Python中使用类获取h3标记_Python_Html_Web Scraping_Beautifulsoup - Fatal编程技术网

如何在web抓取Python中使用类获取h3标记

如何在web抓取Python中使用类获取h3标记,python,html,web-scraping,beautifulsoup,Python,Html,Web Scraping,Beautifulsoup,我想用所附照片中所示的类来刮取h3的文本 我根据发布的建议修改了代码: import requests import urllib session = requests.session() session.headers.update({ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0', 'Accept': '*/*', 'Accept-La

我想用所附照片中所示的类来刮取
h3
的文本

我根据发布的建议修改了代码:

import requests
import urllib

session = requests.session()
session.headers.update({
  'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0',
  'Accept': '*/*',
  'Accept-Language': 'de,en-US;q=0.7,en;q=0.3',
  'Content-Type': 'application/json',
  'Origin': 'https://auth.fool.com',
  'Connection': 'keep-alive',
})

response1 = session.get("https://www.fool.com/secure/login.aspx")
assert response1

response1.cookies
#<RequestsCookieJar[Cookie(version=0, name='_csrf', value='8PrzU3pSVQ12xoLeq2y7TuE1', port=None, port_specified=False, domain='auth.fool.com', domain_specified=False, domain_initial_dot=False, path='/usernamepassword/login', path_specified=True, secure=True, expires=1609597114, discard=False, comment=None, comment_url=None, rest={'HttpOnly': None}, rfc2109=False)]>

params = urllib.parse.parse_qs(response1.url)
params

payload = {
    "client_id": params["client"][0],
    "redirect_uri": "https://www.fool.com/premium/auth/callback/",
    "tenant": "fool",
    "response_type": "code",
    "scope": "openid email profile",
    "state": params["https://auth.fool.com/login?state"][0],
    "_intstate": "deprecated",
    "nonce": params["nonce"][0],
    "password": "XXX",
    "connection": "TMF-Reg-API",
    "username": "XXX",
}
formatted_payload = "{" + ",".join([f'"{key}":"{value}"' for key, value in payload.items()]) + "}"



url = "https://auth.fool.com/usernamepassword/login"
response2 = session.post(url, data=formatted_payload)

response2.cookies
#<RequestsCookieJar[]>
导入请求
导入URL库
会话=请求。会话()
session.headers.update({
“用户代理”:“Mozilla/5.0(Windows NT 10.0;Win64;x64;rv:84.0)Gecko/20100101 Firefox/84.0”,
“接受”:“*/*”,
“接受语言”:de,en-US;q=0.7,en;q=0.3,
“内容类型”:“应用程序/json”,
“来源”:https://auth.fool.com',
“连接”:“保持活动状态”,
})
response1=session.get(“https://www.fool.com/secure/login.aspx")
断言响应1
回答1.饼干
#
params=urllib.parse.parse_qs(response1.url)
params
有效载荷={
“客户端id”:参数[“客户端”][0],
“重定向uri”:https://www.fool.com/premium/auth/callback/",
“租户”:“傻瓜”,
“响应类型”:“代码”,
“范围”:“openid电子邮件配置文件”,
“状态”:参数[”https://auth.fool.com/login?state"][0],
“_intstate”:“已弃用”,
“nonce”:参数[“nonce”][0],
“密码”:“XXX”,
“连接”:“TMF注册API”,
“用户名”:“XXX”,
}
格式化的_payload=“{“+”,”.join([f'{key}):“{value}”表示键,payload.items()中的值)+“}”
url=”https://auth.fool.com/usernamepassword/login"
response2=session.post(url,data=formatted\u有效负载)
回答2.饼干
#

response2.cookies是空的,因此似乎登录失败。

我只能给你一些部分建议,但你可能会找到“最后一块丢失的内容”(我无法访问你目标页面的高级内容)。正确的做法是,您需要先登录才能获取内容:

通常有用的是使用处理cookies的会话。此外,正确的标题通常也会起到以下作用:

导入请求
导入URL库
会话=请求。会话()
session.headers.update({
“用户代理”:“Mozilla/5.0(Windows NT 10.0;Win64;x64;rv:84.0)Gecko/20100101 Firefox/84.0”,
“接受”:“*/*”,
“接受语言”:de,en-US;q=0.7,en;q=0.3,
“内容类型”:“应用程序/json”,
“来源”:https://auth.fool.com',
“连接”:“保持活动状态”,
})
接下来,我们从“官方”登录页面获取一些会话cookie:

response=session.get(“https://www.fool.com/secure/login.aspx")
断言响应
我们将使用一些响应URL(是的,有几个重定向)参数来获取实际登录的有效负载:

params = urllib.parse.parse_qs(response.url)
params

payload = {
    "client_id": params["client"][0],
    "redirect_uri": "https://www.fool.com/premium/auth/callback/",
    "tenant": "fool",
    "response_type": "code",
    "scope": "openid email profile",
    "state": params["https://auth.fool.com/login?state"][0],
    "_intstate": "deprecated",
    "nonce": params["nonce"][0],
    "password": "#pas$w0яδ",
    "connection": "TMF-Reg-API",
    "username": "seralouk@stackoverflow.com",
}
formatted_payload = "{" + ",".join([f'"{key}":"{value}"' for key, value in payload.items()]) + "}"
最后,我们可以登录:

url=”https://auth.fool.com/usernamepassword/login"
response=session.post(url,data=formatted\u有效负载)
让我知道你是否能够登录,或者我们是否需要调整脚本。还有一些一般性的评论:我通常使用一个incognito选项卡来检查浏览器请求,然后将它们复制到postman,在那里我可以使用这些参数,看看它们如何影响HTTP响应。 我很少使用Selenium,而是花时间构建一个适合python的内部库,然后使用BeautifulSoup

编辑: 登录后,您可以使用BeautifulSoup解析实际站点的内容:

#将BeautifulSoup添加到我们的项目中
从bs4导入BeautifulSoup
#将会话与登录cookie一起使用以获取数据
_url=”https://www.fool.com/premium/stock-advisor/coverage/tags/buy-recommendation"
data=BeautifulSoup(session.get(the_url).text'html.parser')
my_h3=data.find(“h3”,“内容项标题”)

您的请求库下载的页面是否与您在浏览器中下载的页面相同?例如,内容可能由JS动态生成。似乎网站需要登录信息。您是否尝试将凭据传递给
请求
findAll(“h3”,“class:“content item headline”})
首先检查页面是否在没有JavaScript和登录的情况下工作
requests
BeautifulSoup
无法运行JavaScipt-它可能需要控制可以运行javaScript的web浏览器。如果你必须登录才能访问此元素,那么你必须使用
请求
登录。我已经编辑了我的帖子,并提供了更多详细信息,感谢回复。我怎么能私下问你更多的问题呢?代码运行得很好,但最终我想删除这个网站的文本数据
https://www.fool.com/premium/stock-advisor/coverage/tags/buy-recommendation
。我试图进行集成,但没有luckI愿意在这里讨论您的项目,这样每个有类似问题的人都可以从我们的会话我的“部分”建议的意思是,我不能输入高级内容。但我认为您应该能够执行上面的代码登录,然后使用会话获取内容,即response=session.get(_url),然后使用BeautifulSoup解析response.text。我发现登录失败。我已经修改了我最初的帖子。