【问题标题】:Web scraping in python returns []python中的网络抓取返回[]
【发布时间】:2020-12-30 18:02:42
【问题描述】:

我是 python 网页抓取的新手。

我正在尝试制作一个从 GoDaddy 域名注册商那里抓取域名及其值的程序。但是,在尝试获取域名时,返回的值是 []。

url = 'https://uk.godaddy.com/domainsearch/find?checkAvail=1&domainToCheck=rocket'

response = requests.get(url)

if not response.ok:
    print('The server responded:', response.status_code)
else:
    soup = BeautifulSoup(response.text, 'lxml')

domain = soup.find_all('span',class_="domain-name-text h4 text-bold")

print(domain)

这是包含我需要的数据的 HTML 段:

<span data-cy="spin-results-wrap-domain-name" dir="ltr">
<span class="domain-name-text h4 text-bold">rockethub</span>
<span class="domain-name-text h4 text-bold domain-name-tld">.</span>
<span class="domain-name-text h4 text-bold domain-name-tld">co</span>
</span>

所有必要的包都安装好了:bs4、lxml和requests。

对此的任何帮助表示赞赏。

【问题讨论】:

  • 这是 HTML 还是来自浏览器 DOM?
  • 这个页面使用javascript来加载数据。也许,您正在寻找 api。如果您打开 dev-tools -> Network -> XHR,您将看到内容。 https://uk.godaddy.com/domainfind/v1/search/spins?&amp;q=rocket&amp;pagestart=0&amp;pagesize=40&amp;tld_gallery_size=5&amp;key=dpp_search&amp;tlds=&amp;source=&amp;maxsld=&amp;pc=&amp;ptl=&amp;itc=dpp_absol1&amp;req_id=1599913966766。这就是你要找的。​​span>

标签: python html web-scraping beautifulsoup lxml


【解决方案1】:

看起来 GoDaddy.com 通过 JavaScript 呈现其网页,并且请求包没有加载 JavaScript 的功能。

也许看看图书馆selenium。它是一个无头网络浏览器,将为您呈现 JavaScript,这意味着它将加载您尝试抓取的域名。

硒代码sn-p:

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

from bs4 import BeautifulSoup

driver = webdriver.Chrome() # You will be required to setup a chrome driver.

driver.get('https://uk.godaddy.com/domainsearch/find?checkAvail=1&domainToCheck=rocket')

try:
    WebDriverWait(driver, 5).until(
        EC.presence_of_element_located((By.CLASS_NAME, "spin-results-wrap"))
    ) # You need to wait for the webpage to render the domains (its an asynchronous web request made).
except TimeoutException:
    raise

html = driver.page_source

soup = BeautifulSoup(html, "html.parser") # Also note I use the html.parser instead of lxml.

domain = soup.find_all('span', class_="domain-name-text h4 text-bold")

print(domain)

这是一个关于如何为 Selenium 设置 ChromeDriver 的好教程:link

【讨论】:

  • 嗨,Shane,我按照你的方法试过了,结果仍然是 []。
  • @StrangeGamer 嘿,我更新了代码以修复错误。这应该够了吧。我自己测试了它并且它有效。享受吧。
【解决方案2】:

对于这种用法,我建议你使用 selenium,在我看来它使用起来要简单得多。 硒代码:

from selenium import webdriver
from selenium.webdriver import Chrome
driver = webdriver.Chrome(r'path/to/your/chromedriver')
driver.get(your_url)
domain = driver.find_element_by_class_name(class_of_the_element)
#domain = class.WebElement--> domain.text to retrieve the string.

下载chromedriver:https://chromedriver.chromium.org/downloads

【讨论】:

    猜你喜欢
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-14
    • 1970-01-01
    • 2014-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多