【发布时间】:2017-09-13 11:18:41
【问题描述】:
我正在做一个抓取项目 - 看看英国的回收公司为不同的产品提供什么
我遇到了这个网站的问题:
http://www.musicmagpie.co.uk/entertainment/
我有一个条形码列表,我想查找其购买价格(在搜索框中输入条形码并点击“添加”按钮)。我已经设法让 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"}
希望有用的信息,我不知道从这里去哪里,谷歌并没有提供太多帮助
【问题讨论】:
-
样本条码?
-
__doPostBack('ctl00$ctl00$ctl00$ContentPlaceHolderDefault$mainContent$tabbedMediaVal_10$getValSmall','')
-
这是你的意思吗?观看了所有该系列的视频,但仍然不确定如果没有 Selenium 我将如何处理这个问题
-
@Leon Kyriacou,即使有人愿意帮助你,他也必须知道条形码是什么样子才能试一试。除了必要的,你写了很多东西。
标签: python selenium web-scraping