2016-08-18 1 views
1

Я пытаюсь создать инструмент для очистки веб-страниц, используя Python и BeautifulSoup, который входит в eBay Featured Collection и извлекает URL-адреса всех продуктов в коллекции (в большинстве коллекций есть 17 продуктов, хотя некоторые из них имеют несколько больше или меньше). Вот URL для коллекции я пытаюсь скрести в моем коде: http://www.ebay.com/cln/ebayhomeeditor/Surface-Study/324079803018Скребок eBay отображает коллекции ссылок на страницы продуктов

Вот мой код до сих пор:

import requests 
from bs4 import BeautifulSoup 

url = 'http://www.ebay.com/cln/ebayhomeeditor/Surface-Study/324079803018' 
soup = BeautifulSoup(requests.get(url).text, 'html.parser') 

product_links = [] 

item_thumb = soup.find_all('div', attrs={'class':'itemThumb'}) 
for link in item_thumb: 
    product_links.append(link.find('a').get('href')) 

print product_links 

Этот скребок должен Append 17 ссылок на список product_links. Однако он работает только частично. В частности, он каждый раз сбрасывает первые 12 ссылок на продукты, оставляя оставшиеся 5 нетронутыми, даже несмотря на то, что все 17 ссылок найдены в тех же тегах и атрибутах HTML. Глядя более внимательно на страницах HTML-коде, единственное различие, которое я нашел, что первые 12 ссылок и окончательную 5 отделены друг от друга куска XML скрипта, который я включил здесь:

<script escape-xml="true"> 
     if (typeof(collectionState) != 'object') { 
      var collectionState = { 
       itemImageSize: {sWidth: 280, sHeight: 280, lWidth: 580, lHeight: 620}, 
       page: 1, 
       totalPages: 2, 
       totalItems: 17, 
       pageId: '2057253', 
       currentUser: '', 
       collectionId: '323101965012', 
       serviceHost: 'svcs.ebay.com/buying/collections/v1', 
       owner: 'ebaytecheditor', 
       csrfToken: '', 
       localeId: 'en-US', 
       siteId: 'EBAY-US', 
       countryId: 'US', 
       collectionCosEnabled: 'true', 
       collectionCosHostExternal: 'https://api.ebay.com/social/collection/v1', 
       collectionCosEditEnabled: 'true', 
       isCollectionReorderEnabled: 'false', 
       isOwnerSignedIn: false || false, 
       partiallySignedInUser: '@@[email protected]@[email protected]@', 
       baseDomain: 'ebay.com', 
       currentDomain: 'www.ebay.com', 
       isTablet: false, 
       isMobile: false, 
       showViewCount: true 
      }; 
     } 
    </script> 

Какова функция этот скрипт? Возможно ли, что этот сценарий является причиной того, что мой скребок пренебрегает очисткой последних 5 ссылок? Есть ли способ обойти это и изменить последние пять?

+0

Это происходит потому, что следующие 5 ссылок загружаются с использованием JavaScript. –

ответ

0

Последние несколько генерируются через AJAX запрос http://www.ebay.com/cln/_ajax/2/ebayhomeeditor/324079803018:

enter image description here

URL-адрес состоит из использования ebayhomeeditor и что должен быть какой-то идентификатор продукта которые как в исходном URL страницы, которую вы посещаете.

Единственным параметром, который необходим для получения данных назад, является itemsPerPage, но вы можете поиграть с остальными и посмотреть, какой эффект у них есть.

params = {"itemsPerPage": "10"} 
soup= BeautifulSoup(requests.get("http://www.ebay.com/cln/_ajax/2/ebayhomeeditor/324079803018", params=params).content) 
print([a["href"] for a in soup.select("div.itemThumb div.itemImg.image.lazy-image a[href]")]) 

Который даст вам:

['http://www.ebay.com/itm/yamazaki-home-tower-book-end-white-stationary-holder-desktop-organizing-steel/171836462366?hash=item280240551e', 'http://www.ebay.com/itm/tetris-constructible-interlocking-desk-lamp-neon-light-nightlight-by-paladone/221571335719?hash=item3396ae4627', 'http://www.ebay.com/itm/iphone-docking-station-dock-native-union-new-in-box/222202878086?hash=item33bc52d886', 'http://www.ebay.com/itm/turnkey-pencil-sharpener-silver-office-home-school-desk-gift-peleg-design/201461359979?hash=item2ee808656b', 'http://www.ebay.com/itm/himori-weekly-times-desk-notepad-desktop-weekly-scheduler-30-weeks-planner/271985620013?hash=item3f539b342d'] 

Так положить его вместе, чтобы получить все URLs:

In [23]: params = {"itemsPerPage": "10"} 

In [24]: with requests.Session() as s: 
    ....:   soup1 = BeautifulSoup(s.get('http://www.ebay.com/cln/ebayhomeeditor/Surface-Study/324079803018').content, 
    ....:        "html.parser") 
    ....:   main_urls = [a["href"] for a in soup1.select("div.itemThumb div.itemImg.image.lazy-image a[href]")] 
    ....:   soup2 = BeautifulSoup(s.get("http://www.ebay.com/cln/_ajax/2/ebayhomeeditor/324079803018", params=params).content, 
    ....:        "html.parser") 
    ....:   print(len(main_urls)) 
    ....:   main_urls.extend(a["href"] for a in soup2.select("div.itemThumb div.itemImg.image.lazy-image a[href]")) 
    ....:   print(main_urls) 
    ....:   print(len(main_urls)) 
    ....:  
12 
['http://www.ebay.com/itm/archi-desk-accessories-pen-cup-designed-by-hsunli-huang-for-moma/262435041373?hash=item3d1a58f05d', 'http://www.ebay.com/itm/moorea-seal-violet-light-crane-scissors/201600302323?hash=item2ef0507cf3', 'http://www.ebay.com/itm/kikkerland-photo-holder-with-6-magnetic-wooden-clothespin-mh69-cable-47-long/361394782932?hash=item5424cec2d4', 'http://www.ebay.com/itm/authentic-22-design-studio-merge-concrete-pen-holder-desk-office-pencil/331846509549?hash=item4d4397e3ed', 'http://www.ebay.com/itm/supergal-bookend-by-artori-design-ad103-metal-black/272273290322?hash=item3f64c0b452', 'http://www.ebay.com/itm/elago-p2-stand-for-ipad-tablet-pcchampagne-gold/191527567203?hash=item2c97eebf63', 'http://www.ebay.com/itm/this-is-ground-mouse-pad-pro-ruler-100-authentic-natural-retail-100/201628986934?hash=item2ef2062e36', 'http://www.ebay.com/itm/hot-fuut-foot-rest-hammock-under-desk-office-footrest-mini-stand-hanging-swing/152166878943?hash=item236dda4edf', 'http://www.ebay.com/itm/unido-silver-white-black-led-desk-office-lamp-adjustable-neck-brightness-level/351654910666?hash=item51e0441aca', 'http://www.ebay.com/itm/in-house-black-desk-office-organizer-paper-clips-memo-notes-monkey-business/201645856763?hash=item2ef30797fb', 'http://www.ebay.com/itm/rifle-paper-co-2017-maps-desk-calendar-illustrated-worldwide-cities/262547131670?hash=item3d21074d16', 'http://www.ebay.com/itm/muji-erasable-pen-black/262272348079?hash=item3d10a66faf', 'http://www.ebay.com/itm/rifle-paper-co-2017-maps-desk-calendar-illustrated-worldwide-cities/262547131670?hash=item3d21074d16', 'http://www.ebay.com/itm/muji-erasable-pen-black/262272348079?hash=item3d10a66faf', 'http://www.ebay.com/itm/yamazaki-home-tower-book-end-white-stationary-holder-desktop-organizing-steel/171836462366?hash=item280240551e', 'http://www.ebay.com/itm/tetris-constructible-interlocking-desk-lamp-neon-light-nightlight-by-paladone/221571335719?hash=item3396ae4627', 'http://www.ebay.com/itm/iphone-docking-station-dock-native-union-new-in-box/222202878086?hash=item33bc52d886', 'http://www.ebay.com/itm/turnkey-pencil-sharpener-silver-office-home-school-desk-gift-peleg-design/201461359979?hash=item2ee808656b', 'http://www.ebay.com/itm/himori-weekly-times-desk-notepad-desktop-weekly-scheduler-30-weeks-planner/271985620013?hash=item3f539b342d'] 
19 

In [25]: 

Существует немного перекрывание с тем, что получает вернулся так просто использовать набор для сохраните main_urls или звонок, установленные в списке:

In [25]: len(set(main_urls)) 
Out[25]: 17 

Не знаете, почему это происходит и на самом деле не пытались понять это, если это вас беспокоит, тогда вы можете разобрать «totalItems: 17» из возвращаемого источника вызова ajax и вычесть длину main_urls после первого вызова и установить {"itemsPerPage": str(len(main_urls) - int(parsedtotal))}, но Я бы не стал слишком беспокоиться об этом.

+0

Есть ли какой-нибудь EBay API для этого? – pratibha

Смежные вопросы