【问题标题】:How to grab more data如何获取更多数据
【发布时间】:2018-10-26 20:16:26
【问题描述】:

我正在尝试下载他们在以下网站上拥有的所有钻石:https://www.bluenile.com/diamond-search?tag=none&track=NavDiaVAll

计划是获取信息并尝试找出我最喜欢购买的那一款(我会做一些回归来找出哪些有很大的价值并选择我最喜欢的)

为此,我编写了我的第一个刮板。问题是它似乎只拿了第 60 颗钻石,而不是我在网站上看到的所有钻石。理想情况下,我希望它能够带走所有 100k+ 的钻石,它们有不同的类型(圆形、垫形等)。 我如何让它给我所有的数据?

(我认为是因为一些新行只有在我向下滚动后才会加载,但我认为第一次加载超过 60,如果我向下滚动到底部,它只会显示 1000)

这是我的代码:

import pandas as pd
import requests
from bs4 import BeautifulSoup

url = 'https://www.bluenile.com/diamond-search?tag=none&track=NavDiaVAll'

url_response = requests.get(url)
soup = BeautifulSoup(url_response.content, "html.parser")

""" Now we have the page as soup

Lets start to get the header"""

headerinctags = soup.find_all('div', class_='grid-header normal-header')
header = headerinctags[0].get_text(';')

diamondsmessy = soup.find_all('a', class_='grid-row row ')
diamondscleaned = diamondsmessy[1].get_text(";")


"""Create diamonds dataframe with the header; take out the 1st value"""
header = header.split(";")
del header[0]
diamonds = pd.DataFrame(columns=header)

""" place rows into dataframe after being split; use a & b as dummy variables; take out 5th value"""

for i in range(len(diamondsmessy)):
    a = diamondsmessy[i].get_text(";")
    b = a.split(";")
    del b[4]
    a = pd.DataFrame(b, index=header)
    b = a.transpose()
    diamonds = pd.concat([diamonds, b], ignore_index=True)

print(diamonds)

【问题讨论】:

    标签: python python-3.x web-scraping beautifulsoup python-requests


    【解决方案1】:

    我已经想出办法了。它并不快,但基本上我需要硒来向下滚动页面。我仍然卡在 1000 行,所以循环了一些东西来更新页面。

    为了帮助别人,代码在这里:

    import pandas as pd
    from selenium import webdriver
    from selenium.webdriver.common.keys import Keys
    from bs4 import BeautifulSoup
    import time
    
    #for fun, let's time this
    start = time.time()
    
    """Define important numbers"""
    
    scroll_pauze_time = 0.5 #delay after scroll
    scroll_number = 20 #number of times scrolled per page
    pages_visited = 25 #number of times the price is increased
    
    """Set up the website"""
    
    url = 'https://www.bluenile.com/diamond-search?tag=none&track=NavDiaVAll'
    
    url_response = webdriver.Firefox()
    url_response.get(url)
    
    #minimum & max carat:
    min_carat = url_response.find_element_by_css_selector('.carat-filter .allowHighAscii:nth-child(1)')
    min_carat.send_keys('0.8')
    min_carat.send_keys(Keys.ENTER)
    
    max_carat = url_response.find_element_by_css_selector('.carat-filter .allowHighAscii:nth-child(2)')
    max_carat.send_keys('1.05')
    max_carat.send_keys(Keys.ENTER)
    
    
    #Shapes of diamonds:
    url_response.find_element_by_css_selector('.shape-filter-button:nth-child(2) > .shape-filter-button-inner').click()
    url_response.find_element_by_css_selector('.shape-filter-button:nth-child(4) > .shape-filter-button-inner').click()
    url_response.find_element_by_css_selector('.shape-filter-button:nth-child(5) > .shape-filter-button-inner').click()
    url_response.find_element_by_css_selector('.shape-filter-button:nth-child(7) > .shape-filter-button-inner').click()
    
    """Create diamonds dataframe with the header; take out the 1st value"""
    soup = BeautifulSoup(url_response.page_source, "html.parser")
    
    headerinctags = soup.find_all('div', class_='grid-header normal-header')
    header = headerinctags[0].get_text(';')
    
    header = header.split(";")
    del header[0]
    diamonds = pd.DataFrame(columns=header)
    
    """Start loop, dummy variable j"""
    for j in range(pages_visited):
    
        print(j)
        url_response.execute_script("window.scrollTo(0, 0)")
    
        #Set the minimum price
        if j != 0:
            min_price = url_response.find_element_by_css_selector('input[name="minValue"]')
    
            min_price.send_keys(Keys.CONTROL,"a");
            min_price.send_keys(Keys.DELETE);
    
            a = diamonds.loc[len(diamonds.count(1))-1,"Price"]
            a = a.replace('$','')
            a = a.replace(',','')
            min_price.send_keys(a)
            min_price.send_keys(Keys.ENTER)
    
        #Scroll down
        for i in range(scroll_number):
                url_response.execute_script("window.scrollTo(0, "+str((i+1)*2000)+')')
                time.sleep(scroll_pauze_time)
    
        #Grab data
        soup = BeautifulSoup(url_response.page_source, "html.parser")
        diamondsmessy = soup.find_all('a', class_='grid-row row ')
    
    
        """ place rows into dataframe after being split; use a & b as dummy variables; take out 5th value"""
    
        for i in range(len(diamondsmessy)):
            a = diamondsmessy[i].get_text(";")
            b = a.split(";")
            del b[4]
            a = pd.DataFrame(b, index=header)
            b = a.transpose()
            diamonds = pd.concat([diamonds, b], ignore_index=True)
    
    diamonds = diamonds.drop_duplicates()
    diamonds.to_csv('diamondsoutput.csv')
    
    print(diamonds)
    
    end = time.time()
    print("This took "+ str(end-start)+" seconds")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-01
      相关资源
      最近更新 更多