使用美丽的汤解决问题newegg.ca

时间:2019-07-14 23:28:39

标签: python html web-scraping beautifulsoup

我过去曾抓过多个网站,但是newegg.ca的结构与其他任何网站都不相同。我使用BeautifulSoup仅提取产品的名称和价格。 我要抓取的网站是https://www.newegg.ca/p/N82E16875606157

到目前为止,我已经使用以下方式抓取了标题:

page = requests.get(URL, headers=headers)
page_soup = BeautifulSoup(page.content, "html.parser")

global ng_title
ng_title = page_soup.find(id="grpDescrip_h").get_text().strip()
print(ng_title)

输出:

Huawei P30 4G LTE Cell Phone 6.1" Breathing Crystal 128GB 6GB RAM

但是我坚持提取价格。也许我需要实现一个for循环?或者还有另一种方式。

感谢您的帮助!

4 个答案:

答案 0 :(得分:1)

我放弃了使用qtwebkit的尝试,因为他们已弃用它,并且无法轻松安装。

在Chuck LaPress的建议下,我研究了硒,努力使它在ubuntu服务器18上运行。最后,结果非常简单:

sudo apt install chromium-browser
sudo apt install chromium-chromedriver
pip install lxml selenium

然后以下代码将起作用!

from selenium import webdriver
from time import sleep

options = webdriver.ChromeOptions()
options.binary_location = '/usr/bin/chromium-browser'
options.add_argument("headless")

driver = webdriver.Chrome(options=options)

url = 'https://www.newegg.ca/p/N82E16875606157'
driver.get(url);
sleep(3)

name = driver.find_element_by_css_selector("#grpDescrip_h span")
price = driver.find_element_by_css_selector("#landingpage-price .price-current")

print(name.text)
print(price.text)

答案 1 :(得分:1)

我本以为更简单的解决方案是硒,而不是像这样的bs4,

from lxml import html
from time import sleep
from selenium import webdriver


def parse(url):
    response = webdriver.Chrome()
    response.get(url)
    sleep(3)
    name = response.find_element_by_xpath(' //*[@id="grpDescrip_75-606-157"]')
    price = response.find_element_by_xpath(' //*[@id="landingpage-price"]/div/div/ul/li[3]')
    details = response.find_element_by_xpath(' //*[@id="synopsis"]/div[4]/div/div[9]/ul')


    print(name.text)
    print(price.text)
    print(details.text)



    sleep(1)


if __name__ == '__main__':

    parse('https://www.newegg.ca/p/N82E16875606157')

你怎么看?

答案 2 :(得分:1)

正如其他答案所述,这基本上是因为页面内容是通过JavaScript加载的,而借助urlopener或request获取源代码将不会加载该动态部分。

因此,这里有个解决方法,实际上您可以利用来加载动态内容,然后从那里获取源代码并使用BeautifulSoup对其进行解析。在浏览器解析了完整的源代码之后,您可以使用它进行任何操作。这是实际给出您期望结果的代码。但是您需要设置selenium web driver

from lxml import html
from bs4 import  BeautifulSoup
from time import sleep
from selenium import webdriver


def parse(url):
    response = webdriver.Firefox()
    response.get(url)
    sleep(3)
    sourceCode=response.page_source
    return  sourceCode


year =2019
soup = BeautifulSoup(parse("https://www.newegg.ca/p/N82E16875606157"),'lxml')
##Do with whatever you want with the source code

答案 3 :(得分:0)

您不需要硒,价格就在HTML中!
在拿出大手笔之前,请先尝试检查HTML。使用Ctrl + U查看页面源,然后按Ctrl + F搜索价格949,您将看到价格:

<div itemprop='offers' itemscope itemtype='//schema.org/Offer'>
                                <meta itemprop='price' content='949.00' />
                                <meta itemprop='priceCurrency' content='CAD' />
                              </div>

然后:

import requests
from bs4 import BeautifulSoup

url = 'https://www.newegg.ca/p/N82E16875606157'
res = requests.get(url)
res.raise_for_status()
html = res.text
soup = BeautifulSoup(html, 'html.parser')
price = float(soup.select_one('[itemprop=price]')['content'])
print(price)

输出:

949.0