我过去曾抓过多个网站,但是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循环?或者还有另一种方式。
感谢您的帮助!
答案 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