Python 刮削网站需要互动

Python 刮削网站需要互动,python,selenium,web-scraping,Python,Selenium,Web Scraping,我正在做一个报废项目——看看英国的回收公司为不同的产品提供了什么 我在这个网站上遇到了一个问题: 我有一个条形码列表,我想找到他们的购买价格(在搜索框中输入条形码并点击“添加”按钮)。我已经设法让Selenium Webdriver工作了,但这是一个非常缓慢的过程,我无法在没有网站的情况下运行大量条形码,并在某个时候杀死我的过程 我的目标是每秒搜索1次,目前平均需要5秒以上。这是我正在运行的代码: driver = webdriver.Chrome(r"C:\Users\leonK\Docum

我正在做一个报废项目——看看英国的回收公司为不同的产品提供了什么

我在这个网站上遇到了一个问题:

我有一个条形码列表,我想找到他们的购买价格(在搜索框中输入条形码并点击“添加”按钮)。我已经设法让Selenium Webdriver工作了,但这是一个非常缓慢的过程,我无法在没有网站的情况下运行大量条形码,并在某个时候杀死我的过程

我的目标是每秒搜索1次,目前平均需要5秒以上。这是我正在运行的代码:

driver = webdriver.Chrome(r"C:\Users\leonK\Documents\Python Scripts\chromedriver.exe")
driver.get('http://www.musicmagpie.co.uk/start-selling/basket-media')

countx = 0
count = 0
for EAN in EANs:
    countx += 1
    count += 1

    if count % 200 == 0:
        driver.close()
        driver = webdriver.Chrome(r"C:\Users\leonK\Documents\Python Scripts\chromedriver.exe")
        driver.get('http://www.musicmagpie.co.uk/start-selling/basket-media')
        count = 1

    driver.find_element_by_xpath("""//*[@id="txtBarcode"]""").send_keys(str(EAN))

    #If popup window appears, exception will close it as first click will fail.
    try:    
        driver.find_element_by_xpath("""//*[@id="getValSmall"]""").click()
    except:
        driver.find_element_by_xpath("""//*[@id="gform_close"]""").click()

    prodnames = driver.find_elements_by_xpath("""//div[@class='col_Title']""")
    if len(prodnames) == count:
        ProductName.append(prodnames[0].text)
        BuyPrice.append(driver.find_elements_by_xpath("""//div[@class='col_Price']""")[0].text)
    else:
        ProductName.append('nan')
        BuyPrice.append('nan')
        count = len(prodnames)

    elapsed = time.clock()    
    print('MusicMagpieScraper:', EAN, '--', countx, '/', len(EANs), '--', (elapsed - start), 's')

driver.close()
我有一些使用Urllib和使用BeautifulSoup进行解析的经验,我更愿意切换到这一点。但是,我不知道如何在没有webdriver点击的情况下提取这些数据

任何建议/提示都将非常宝贵

增加:

添加按钮链接是:

__doPostBack('ctl00$ctl00$ctl00$ContentPlaceHolderDefault$mainContent$tabbedMediaVal_10$getValSmall','')
这是我找到的JS函数:

{name: "__EVENTTARGET", value: ""}
{name: "__EVENTARGUMENT", value: ""}
{name: "__VIEWSTATE", value: "/wEPDwUENTM4MQ9kFgJmD2QWAmYPZBYCZg9kFgJmD2QWBGYPZB…uZSAhaW1wb3J0YW50O2RkQweS+jvDtjK8er7dCKBBRwOWWuE="}
{name: "ctl00$ctl00$ctl00$ContentPlaceHolderDefault$signIn_8$hdn_BasketValue", value: "2"}
{name: "ctl00$ctl00$ctl00$ContentPlaceHolderDefault$mainContent$tabbedMediaVal_10$txtBarcode", value: "5051275026429"}
{name: "ctl00$ctl00$ctl00$ContentPlaceHolderDefault$mainContent$tabbedMediaVal_10$wtmBarcode_ClientState", value: ""}
{name: "ctl00$ctl00$ctl00$ContentPlaceHolderDefault$mainContent$tabbedTechVal_11$txtSearch", value: "Enter item (e.g. iPhone 5)"}
{name: "ctl00$ctl00$ctl00$ContentPlaceHolderDefault$mainContent$tabbedTechVal_11$wmSearch_ClientState", value: ""}
{name: "ctl00$ctl00$ctl00$ContentPlaceHolderDefault$mainContent$LegoVal_12$ddlLego", value: "-999"}
{name: "ctl00$ctl00$ctl00$ContentPlaceHolderDefault$mainContent$TotalValueBox_14$txtPromoVoucher_sm", value: ""}
{name: "ctl00$ctl00$ctl00$ContentPlaceHolderDefault$mainContent$TotalValueBox_14$txtPromoVoucher", value: ""}
{name: "__SCROLLPOSITIONX", value: "0"}
{name: "__SCROLLPOSITIONY", value: "0"}
{name: "hiddenInputToUpdateATBuffer_CommonToolkitScripts", value: "1"}
第4行是输入条形码的位置:

{name: "ctl00$ctl00$ctl00$ContentPlaceHolderDefault$mainContent$tabbedMediaVal_10$txtBarcode", value: "5051275026429"}

希望有用的信息,我不知道从这里到哪里去,谷歌也没有太多帮助

我设法通过请求找到了解决方案

    get_response = requests.get(url='http://www.musicmagpie.co.uk/start-selling/')
    post_data = {'__EVENTTARGET' : 'ctl00$ctl00$ctl00$ContentPlaceHolderDefault$mainContent$tabbedMediaVal_10$getValSmall',
           '__EVENTARGUMENT' : '',
           'ctl00$ctl00$ctl00$ContentPlaceHolderDefault$mainContent$tabbedMediaVal_10$txtBarcode' : ean}
    # POST some form-encoded data:
    post_response = requests.post(url='http://www.musicmagpie.co.uk/start-selling/', data=post_data)    

    soup = BeautifulSoup(post_response.text, "lxml")

    BuyPrice = soup.find('div', class_='col_Price').text.rstrip()
    ProductName = soup.find('div', class_='col_Title').text.rstrip()

这段代码发送一个函数/值的字典(可能不是正确的术语!),并返回一个易于解析的响应,我从中提取了所需的数据

转到这些教程,它们将帮助您。条形码示例?uu doPostBack('ctl00$ctl00$ctl00$ContentPlaceHolderDefault$mainContent$tabbedMediaVal_u10$getValSmall','')这是您的意思吗?看了所有这一系列的视频,仍然不确定如果没有这些,我会怎么做Selenium@LeonKyriacou,即使有人愿意帮助你,他也必须知道条形码是什么样子才能给你注射。除了那个必要的东西外,你写了这么多东西。