现在已经三天了,我为此折磨了脑筋。因此任何帮助将不胜感激。 遇到我要抓取flipkart.com的问题,我在出现相同问题之前就使用了scrapy,s
from urllib.request import urlopen as ureq
from bs4 import BeautifulSoup as soup
url = 'https://www.flipkart.com/offers-list/top-selling-mobiles?screen=dynamic&pk=themeViews%3DTopsellers-Mobiles-March18%3ADesk~widgetType%3DdealCard~contentType%3Dneo&wid=8.dealCard.OMU&otracker=clp_omu_Top%2BSelling%2BMobiles_mobile-phones-store_7'
uclient = ureq(url)
page_html = uclient.read()
uclient.close()
page_soup = soup(page_html, 'html.parser')
container = page_soup.find_all("div", {"class":"MDGhAp"})
容器应返回一堆对象,而不是一个空列表。 我想在每个智能手机上单击,以便可以提取文本。 我在做什么错,任何人都可以猜到。
答案 0 :(得分:1)
恐怕您没有注意到您的网站是由javascript渲染的。
如果您希望您的项目成功,有多种方法可以实现。
首先,
找出带来所需数据的network call
{API},并在项目中模拟该调用。
其次,使用splash
或其他javascript渲染工具在您的响应中获取js rendered
html。
答案 1 :(得分:0)
如果使用Selenium,它将返回容器中的12个元素。
import bs4
from selenium import webdriver
url = 'https://www.flipkart.com/offers-list/top-selling-mobiles?screen=dynamic&pk=themeViews%3DTopsellers-Mobiles-March18%3ADesk~widgetType%3DdealCard~contentType%3Dneo&wid=8.dealCard.OMU&otracker=clp_omu_Top%2BSelling%2BMobiles_mobile-phones-store_7'
browser = webdriver.Chrome('C:\chromedriver_win32\chromedriver.exe')
browser.get(url)
html = browser.page_source
page_soup = bs4.BeautifulSoup(html,'html.parser')
container = page_soup.find_all("div", {"class":"MDGhAp"})
现在您可以开始从每个元素中提取文本了:
for element in container:
print(element.text.strip())
输出:
Asus Zenfone Max Pro M2Upto 6GB RAM|64GB ROMFrom ₹12,999
Redmi Note 6 ProUpto 6GB RAM|64GB ROMFrom ₹13,999
Realme C16.2" Notch DisplayNow ₹7,499
Asus Zenfone Max M2Upto 4GB RAM|64GB ROMFrom ₹9,999
Honor 9N13MP+2MP |16MP CameraFrom ₹8,999
Realme 2 Pro3500 mAh BatteryFrom ₹13,990
Nokia 5.1 Plus 13MP+5MP | 8MP CameraNow ₹9,999
Realme 2Upto 4GB RAM|64GB ROMFrom ₹8,990
Google Pixel 35.5" FHD+ DisplayFrom ₹71,000
Redmi 612MP+5MP|5MP CameraFrom ₹8,499
Samsung Galaxy On64 GB RAM | 64 GB ROMNow ₹12,990
Nokia 6.1 Plus (4GB, 64 GB) 16MP+5MP Rear CameraNow ₹14,999