从特定 url 抓取链接
Posted
技术标签:
【中文标题】从特定 url 抓取链接【英文标题】:Scraping the links from a specific url 【发布时间】:2017-09-04 03:22:26 【问题描述】:这是我的第一个问题,如果我解释了任何错误,请原谅我。
我正在尝试从 python 中的特定网站抓取 url,并将链接解析为 csv。问题是当我在 BeautifulSoup 中解析网站时,我无法提取 url,因为当我在 python 中解析它时,我只能得到<div id="dvScores" style="min-height: 400px;">\n</div>,
,而在那个分支下什么也没有。但是当我打开控制台并复制链接所在的表格并将其粘贴到文本编辑器时,它会粘贴 600 页的 html。我想做的是编写一个显示链接的 for 循环。 html的结构如下:
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
#shadow-root (open)
<head>...</head>
<body>
<div id="body">
<div id="wrapper">
#multiple divs but i don't need them
<div id="live-master"> #what I need is under this div
<span id="contextual">
#multiple divs but i don't need them
<div id="live-score-master"> #what I need is under this div
<div ng-app="live-menu" id="live-score-rightcoll">
#multiple divs but i don't need them
<div id="left-score-lefttemp" style="padding-top: 35px;">
<div id="dvScores">
<table cellspacing=0 ...>
<colgroup>...</colgroup>
<tbody>
<tr class="row line-bg1"> #this changes to bg2 or bg3
<td class="row">
<span class="row">
<a href="www.example.com" target="_blank" class="td_row">
#I need to extract this link
</span>
</td>
#Multiple td's
</tr>
#multiple tr class="row line-bg1" or "row line-bg2"
.
.
.
</tbody>
</table>
</div>
</div>
</div>
</div>
</span>
</div>
</div>
</body>
</html>
我做错了什么?我需要自动化一个系统供 python 执行,而不是将 html 粘贴到文本并使用正则表达式提取链接。 我的python代码也在下面:
import requests
from bs4 import BeautifulSoup
r=requests.get("http://example.com/example")
c=r.content
soup=BeautifulSoup(c,"html.parser")
all=soup.find_all("span",id="contextual")
span=all[0].find_all("tbody")
【问题讨论】:
你能指定你想要的输出吗?网址是不是像:http://www.mackolik.com/Mac/2581146/Kayserispor-Osmanlıspor-FK
?
@vold 是的,正确。对于每场比赛,球队名称之间都有一个链接。这就是我要提取的链接。
【参考方案1】:
如果你正在尝试抓取 url,那么你应该得到 href:
urls = soup.find_all('a', href=True)
【讨论】:
我试过了,它不起作用,我不知道为什么,但它绕过了<span id="contextual">
中的链接
你确定吗?我设法从您发布的示例中提取了“www.example.com”。你能告诉我实际的页面吗?
"www.mackolik.com/Canli-Sonuclar" 我需要的链接是你点击乐谱的那个。
看起来你想要的内容是js生成的:getFootballGroup()
,getBasketballGroup()
。您必须研究这些函数并查看它们的作用。此外,该网站不喜欢机器人,我不得不欺骗用户代理和引用者来显示页面。另一种方法是使用 selenium
,祝你好运。【参考方案2】:
此站点使用 javascript 填充其内容,因此,您无法通过 beautifulsoup 获取 url。如果您在浏览器中检查网络选项卡,您会发现 this link。它包含您需要的所有数据。您可以简单地解析它并提取所有所需的值。
import requests
req = requests.get('http://goapi.mackolik.com/livedata?group=0').json()
for el in req['m'][4:100]:
index = el[0]
team_1 = el[2].replace(' ', '-')
team_2 = el[4].replace(' ', '-')
print('http://www.mackolik.com/Mac//-'.format(index, team_1, team_2))
【讨论】:
非常感谢。我想问最后一件事,有些链接包含http://www.mackolik.com/Mac/...
,有些链接应该包含http://www.mackolik.com/Basket-Mac/...
,我怎样才能写出区分这两者的东西?
很抱歉,但我必须由您决定。我只能发现这些网址因足球队和篮球队而异。您需要在 json 数据中发现它们之间的差异(可能是他们的联赛名称?),并在脚本中添加一个条件语句来检查差异并返回正确的 url。或者您可以简单地根据他们当前的位置更改 url:首先,返回足球 url,然后将 Basket-
添加到 url 并返回剩余的篮球 url。
按照您的建议找到了一个标识符来区分这些类型。再次感谢你:)
没问题。很高兴能为您提供帮助。【参考方案3】:
似乎html是由js动态生成的。您需要使用爬虫对其进行爬网以模仿浏览器。由于您使用的是requests
,它已经有一个爬虫session
。
session = requests.session()
data = session.get ("http://website.com").content #usage xample
在此之后,您可以进行解析、额外的抓取等操作。
【讨论】:
我试过了,但没有成功,它只给出了网站的几行标题。 可能网站正在检查用户代理。您是否尝试将用户代理更改为 chrome 之类的东西?以上是关于从特定 url 抓取链接的主要内容,如果未能解决你的问题,请参考以下文章