【问题标题】:Returning webSITE links Python Beautifulsoup返回网站链接 Python Beautifulsoup
【发布时间】:2016-12-19 17:16:18
【问题描述】:

我正在使用 Python 3.5 和 beautifulsoup (bs4) 和 urllib。我将附加的代码返回一个页面的所有链接。

我如何循环它以便它在网站的所有页面上运行,使用在每个页面上找到的链接来指示接下来要抓取哪些页面。因为我不知道我需要走多少跳。

我当然尝试过循环播放它,但它永远不会停止,因为页面包含指向我已经扫描过的页面的链接。我已经尝试创建一组我扫描过的链接,放入 IF not in set ...但它再次永远运行。

import bs4
import re
import urllib.request

website = 'http://elderscrolls.wikia.com/wiki/Skyrim'

req = urllib.request.Request(website)

with urllib.request.urlopen(req) as response:
    the_page = response.read()#store web page html

dSite = bs4.BeautifulSoup(the_page, "html.parser")

links = []

for link in dSite.find_all('a'):#grab all links on page
    links.append(link.get('href'))

siteOnly = re.split('/', website)

validLinks = set()

for item in links:
    if re.search('^/' +siteOnly[3] + '/', str(item)):#filter links to local website
        newLink = 'http://' + str(siteOnly[2]) + str(item)
        validLinks.add(newLink)

print(validLinks)

【问题讨论】:

  • 你的实际目标是什么?访问网站上的每个页面,尤其是 wiki,花费很长时间,页面太多了。这表明存在更大的问题/误解。
  • 我写的脚本已经完成了……是的,需要一两个小时。我的脚本运行,它实际上会找到所有链接(使文本文档的大小约为 200KB,只是链接的大小。但是,它会停止寻找新的...但不会停止。我正在努力编写检查它何时运行没有新的链接要停止。

标签: python web-scraping beautifulsoup


【解决方案1】:
import bs4, requests
from urllib.parse import urljoin

base_url = 'http://elderscrolls.wikia.com/wiki/Skyrim'
response = requests.get(base_url)
soup = bs4.BeautifulSoup(response.text, 'lxml')
local_a_tags = soup.select('a[href^="/wiki/"]')
links = [a['href']for a in local_a_tags]
full_links = [urljoin(base_url, link) for link in links]
print (full_links)

出来:

http://elderscrolls.wikia.com/wiki/The_Elder_Scrolls_Wiki
http://elderscrolls.wikia.com/wiki/Portal:Online
http://elderscrolls.wikia.com/wiki/Quests_(Online)
http://elderscrolls.wikia.com/wiki/Main_Quest_(Online)
http://elderscrolls.wikia.com/wiki/Aldmeri_Dominion_Quests
http://elderscrolls.wikia.com/wiki/Daggerfall_Covenant_Quests
http://elderscrolls.wikia.com/wiki/Ebonheart_Pact_Quests
http://elderscrolls.wikia.com/wiki/Category:Online:_Side_Quests
http://elderscrolls.wikia.com/wiki/Factions_(Online)
http://elderscrolls.wikia.com/wiki/Aldmeri_Dominion_(Online)
http://elderscrolls.wikia.com/wiki/Daggerfall_Covenant
http://elderscrolls.wikia.com/wiki/Ebonheart_Pact
http://elderscrolls.wikia.com/wiki/Classes_(Online)
http://elderscrolls.wikia.com/wiki/Dragonknight
http://elderscrolls.wikia.com/wiki/Sorcerer_(Online)
http://elderscrolls.wikia.com/wiki/Nightblade_(Online)
http://elderscrolls.wikia.com/wiki/Templar
http://elderscrolls.wikia.com/wiki/Races_(Online)
http://elderscrolls.wikia.com/wiki/Altmer_(Online)
http://elderscrolls.wikia.com/wiki/Argonian_(Online)
http://elderscrolls.wikia.com/wiki/Bosmer_(Online)
http://elderscrolls.wikia.com/wiki/Breton_(Online)
http://elderscrolls.wikia.com/wiki/Dunmer_(Online)
http://elderscrolls.wikia.com/wiki/Imperial_(Online)
http://elderscrolls.wikia.com/wiki/Khajiit_(Online)
http://elderscrolls.wikia.com/wiki/Nord_(Online)
http://elderscrolls.wikia.com/wiki/Orsimer_(Online)
http://elderscrolls.wikia.com/wiki/Redguard_(Online)
http://elderscrolls.wikia.com/wiki/Locations_(Online)
http://elderscrolls.wikia.com/wiki/Regions_(Online)
http://elderscrolls.wikia.com/wiki/Category:Online:_Realms
http://elderscrolls.wikia.com/wiki/Category:Online:_Cities
http://elderscrolls.wikia.com/wiki/Category:Online:_Dungeons
http://elderscrolls.wikia.com/wiki/Category:Online:_Dark_Anchors
http://elderscrolls.wikia.com/wiki/Wayshrines_(Online)
http://elderscrolls.wikia.com/wiki/Category:Online:_Unmarked_Locations
http://elderscrolls.wikia.com/wiki/Combat_(Online)
http://elderscrolls.wikia.com/wiki/Skills_(Online)
http://elderscrolls.wikia.com/wiki/Ultimate_Skills
http://elderscrolls.wikia.com/wiki/Synergy
http://elderscrolls.wikia.com/wiki/Finesse
http://elderscrolls.wikia.com/wiki/Add-ons

首先,使用 requests 代替 urllib。

然后,使用 Beautifulsoup CSS 选择器可以过滤开头的 href,您可以参考document 了解更多信息。

最后,使用 urljoin 将相对 url 转换为绝对 url

>>> from urllib.parse import urljoin
>>> urljoin('http://www.cwi.nl/%7Eguido/Python.html', 'FAQ.html')
'http://www.cwi.nl/%7Eguido/FAQ.html'

【讨论】:

  • 谢谢。虽然不一定回答我的问题,但你给了我一些关于如何清理我的代码的可靠提示,并在此过程中让我找到了解决方案。
猜你喜欢
  • 2022-11-19
  • 2013-04-08
  • 2022-12-09
  • 2017-06-24
  • 2022-01-10
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
  • 1970-01-01
相关资源
最近更新 更多