【问题标题】:Python web scraper using selenium使用 selenium 的 Python 网络爬虫
【发布时间】:2020-10-07 19:36:35
【问题描述】:

我正在开发一个网络爬虫,正如您所知,一切都已得到保护,所以我正在研究这个 硒驱动程序 这不起作用

from selenium import webdriver
import pandas as pd
import bs4
products = []
prices = []
orginalPrice =[]
sizes = []
open('product.csv','w')
driver = webdriver.Chrome("/home/arcot/Documents/chromedriver")
driver.get("https://www.myntra.com/bra")
content = driver.page_source
soup = bs4.BeautifulSoup(content,features="lxml")
for a in soup.find('li', attrs={'class':'product-base'}):
    productName = a.find('h3', attrs={'class':'product-product'})
    productBrand = a.find('h4', attrs={'class':'product-brand'})
    size = a.find('button', attrs={'class':'product-sizeButton'})
    productPrice = a.find('span', attrs={'class':'product-discountedPrice'})
    OrginalPrice = a.find('span', attrs={'class':'product-strike'})
    name=(str(productBrand)+" "+str(productName))
    products.append(name)
    prices.append(str(productPrice))
    orginalPrice.append(str(OrginalPrice))
data = {'ProductName':products,'Price':prices,'orginalPrice':orginalPrice,'Sizes':sizes}
df = pd.DataFrame.from_dict(data, orient='index')
df.to_csv('product.csv', index=True, encoding='utf-8')

我尝试调试,但我不知道为什么它不来但价格来了,但我尝试过其他产品不来。谁能帮帮我?

【问题讨论】:

    标签: python-3.x pandas selenium web-scraping


    【解决方案1】:

    有一种方法可以只用一个属性来抓取所有信息,只需查看代码并找到它。

    分享一个代码可能对你的工作有帮助:

    除了webdriver,我导入Options

    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    

    Options 为我们提供了一个强大的选项,可以像人类一样使用我们的 Chrome 机器人,并避免被您正在抓取的网页检测到,只需添加以下代码:

    chrome_options = Options()
    chrome_options.add_argument('--start-maximized')
    driver = webdriver.Chrome(options=chrome_options, executable_path=r"chromedriver")
    driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {"source": 
    """Object.defineProperty(navigator, 
    'webdriver', {get: () => undefined})"""})
    

    然后,像这样调用你的页面:

    url = 'https://www.myntra.com/bra'
    driver.get(url)
    

    您的页面列出所有数据并将其保存到<ul>,因此我利用<li>,因为它有一个名为product-base 的类 所以我们将完整的产品列表保存为 selenium list:

    data = driver.find_elements_by_class_name('product-base')
    

    最后,我们需要将data 传递给另一个python list 才能访问文本。

    data_clean = []
    for i in range(len(data)):
        data_clean.append(data[i].text)
    

    如果你print(data_clean),会看到一些烦人的字符,比如\n,所以让我们清理一下吧:

    data_clean = [x.replace("\n", "|") for x in data_clean] #I used | but you can change
    

    就是这样!:

    print(data_clean)
    

    收益分数、喜欢、产品名称、描述、价格、折扣和百分比:

    '4|||2.4k|Zivame|Lightly Padded T-shirt Bra|Rs. 417Rs. 695(40% OFF)',
    '4.2|||3k|DressBerry|Non Padded Sports Bra|Rs. 324Rs. 499(35% OFF)',
    '4.1|||359|Enamor|Lightly Padded Sports Bra|Rs. 399',
    

    为了保持答案干净,我没有打印完整列表,但 data_clean 为 pandas 准备了 50 个结果。

    完整代码:

    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    
    chrome_options = Options()
    chrome_options.add_argument('--start-maximized')
    driver = webdriver.Chrome(options=chrome_options, executable_path=r"chromedriver")
    driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {"source": 
    """Object.defineProperty(navigator, 
    'webdriver', {get: () => undefined})"""})
    
    url = 'https://www.myntra.com/bra'
    driver.get(url)
    
    data = driver.find_elements_by_class_name('product-base')
    
    data_clean = []
    for i in range(len(data)):
        data_clean.append(data[i].text)
    
    data_clean = [x.replace("\n", "|") for x in data_clean]
    print(data_clean)
    

    【讨论】:

    • 非常感谢
    • @niveditamadhava 没问题!如果您认为它对您有帮助,请务必对答案进行评分。谢谢!
    • 是的,但如果您不介意@Alberto Castilo,您也可以从网址中获取尺寸,就像其中也提到了尺寸
    • 如何从网站@AlbertoCastilo 获取尺寸数据
    • @niveditamadhava 我看到尺寸是通过悬停激活的,所以我们需要考虑另一种策略。你介意我们通过 Telegram 连接来解决这个问题吗?我是尸体
    猜你喜欢
    • 2013-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多