【问题标题】:Python request api is not fetching data inside table bodiesPython 请求 api 未在表体内获取数据
【发布时间】:2023-12-04 21:14:01
【问题描述】:

我正在尝试废弃网页以从请求响应返回的文本数据中获取表格值。

</thead>
 <tbody class="stats"></tbody>
 <tbody class="annotation"></tbody>
 </table>
 </div>

实际上tbody 类中存在一些数据,但`我无法使用请求访问该数据。

这是我的代码

server = "http://www.ebi.ac.uk/QuickGO/GProtein"
header = {'User-agent': 'Mozilla/5.0 (Windows; U; Windows NT 5.1; de; 
rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5'}
payloads = {'ac':'Q9BRY0'}
response = requests.get(server, params=payloads)

print(response.text)
#soup = BeautifulSoup(response.text, 'lxml')
#print(soup)

【问题讨论】:

  • BeautifulSoup(response, 'lxml') 应该是 BeautifulSoup(response.text, 'lxml')
  • 是的。但是,我正在打印我在上面显示的我没有在正文中获取数据的 response.text。
  • 页面内容似乎无法使用 BeautifulSoup 访问。您需要来自多个页面的内容还是可以用鼠标单击“下载”按钮?
  • 是的。 ebi.ac.uk/QuickGO/GProtein?ac=Q9BRY0 是页面。我开始知道 requests 和 beautifulsoup api 无法获取和解析 javascript 呈现的博客。任何建议如何做到这一点? @比尔贝尔

标签: python python-3.x web-scraping python-requests urllib2


【解决方案1】:

坦率地说,我开始对涉及硒等产品的常规抓取失去兴趣,然后我不确定它是否会起作用。这种方法可以。

如果您有多个文件要下载,您只会这样做,至少在这种形式下。

>>> import bs4
>>> form = '''<form method="POST" action="GAnnotation"><input name="a" value="" type="hidden"><input name="termUse" value="ancestor" type="hidden"><input name="relType" value="IPO=" type="hidden"><input name="customRelType" value="IPOR+-?=" type="hidden"><input name="protein" value="Q9BRY0" type="hidden"><input name="tax" value="" type="hidden"><input name="qualifier" value="" type="hidden"><input name="goid" value="" type="hidden"><input name="ref" value="" type="hidden"><input name="evidence" value="" type="hidden"><input name="with" value="" type="hidden"><input name="source" value="" type="hidden"><input name="q" value="" type="hidden"><input name="col" value="proteinDB,proteinID,proteinSymbol,qualifier,goID,goName,aspect,evidence,ref,with,proteinTaxon,date,from,splice" type="hidden"><input name="select" value="normal" type="hidden"><input name="aspectSorter" value="" type="hidden"><input name="start" value="0" type="hidden"><input name="count" value="25" type="hidden"><input name="format" value="gaf" type="hidden"><input name="gz" value="false" type="hidden"><input name="limit" value="22" type="hidden"></form>'''
>>> soup = bs4.BeautifulSoup(form, 'lxml')
>>> action = soup.find('form').attrs['action']
>>> action 
'GAnnotation'
>>> inputs = soup.findAll('input')
>>> params = {}
>>> for input in inputs:
...     params[input.attrs['name']] = input.attrs['value']
...     
>>> import requests
>>> r = requests.post('http://www.ebi.ac.uk/QuickGO/GAnnotation', data=params)
>>> r
<Response [200]>
>>> open('temp.htm', 'w').write(r.text)
4082

只要单击按钮,您就会收到下载的文件。

Chrome 浏览器的详细信息:

  • 在 Chrome 中打开页面。
  • 右键单击“下载”链接。
  • 选择“检查”。
  • 在 Chrome _Developer_ 菜单(靠近顶部)中选择“网络”,然后选择“全部”。
  • 点击页面中的“下载”。
  • --> 在新打开的窗口中单击“下载”。
  • “quickgoUtil.js:36”将出现在“启动器”列中。
  • 点击它。
  • 现在您可以在 `form.submit();` 上设置断点,方法是单击其行号。
  • 再次点击“下载”;执行将在断点处暂停。
  • 在右侧窗口中通知“本地”。它的内容之一是`form`。您可以将其展开为表单的内容。

您需要此元素的 outerHTML 属性来获取上面代码中使用的信息,即其 action 和名称-值对。 (以及使用 POST 的隐含信息。)

现在使用 requests 模块向网站提交请求。

这是params 中的项目列表,以备您提出其他请求时使用。

>>> for item in params.keys():
...     item, params[item]
... 
('qualifier', '')
('source', '')
('count', '25')
('protein', 'Q9BRY0')
('format', 'gaf')
('termUse', 'ancestor')
('gz', 'false')
('with', '')
('goid', '')
('start', '0')
('customRelType', 'IPOR+-?=')
('evidence', '')
('aspectSorter', '')
('tax', '')
('relType', 'IPO=')
('limit', '22')
('col', 'proteinDB,proteinID,proteinSymbol,qualifier,goID,goName,aspect,evidence,ref,with,proteinTaxon,date,from,splice')
('q', '')
('ref', '')
('select', 'normal')
('a', '')

【讨论】:

  • 你能详细说明你在哪里找到var postRequest = this.postRequest = function(url, params, inputparams)吗?
  • 感谢您的详细说明。但是当我单击下载时,我在 Initiator 中没有获得 quickgoUtil.js:36,我什么也得不到。然后显示一个弹出窗口然后如果我在弹出窗口中再次单击下载,我会得到另一个启动器,而不是你得到的那个.. 图片:imgur.com/a/fKskU
  • 我可以验证您使用的是 Chrome 的“版本 59.0.3071.115(官方版本)(64 位)”吗?
  • 我问是因为我和下一个人在同一条船上。我尝试从page 中抓取视频,但除非我渲染 javascript 并且我不想使用 selenium,否则它具有视频的 iframe 不会显示。那么关于如何在不使用 selenium 的情况下获得 iframe['src'] 的任何想法?
  • 我不小心漏了一个步骤! “在新打开的窗口中单击下载。”请参见上文。
【解决方案2】:

我从您上面的评论中得知您正在处理 javascript。为了抓取和解析 javascript,您可以使用 selenium,这是一个可以帮助您解决问题的 sn-p:

from selenium import webdriver
from bs4 import BeautifulSoup

url =''

browser = webdriver.Chrome()
browser.get(url)
soup = BeautifulSoup(browser.page_source, "lxml")
soup.prettify()

您必须安装 ChromeDriver 和 Chrome 浏览器。 如果你愿意,你可以使用像 PhantomJs 这样的无头浏览器,这样你就不必在每次执行脚本时都处理整个 chrome 浏览器。

【讨论】:

    最近更新 更多