簡體   English   中英

使用硒和beautifulsoup進行無限滾動的Scrape網站返回重復的元素

[英]Scrape websites with infinite scrolling using selenium and beautifulsoup return repeated elements

所以我有使用Selenium和BeautifulSoup抓取此網站的腳本:' http : //m.1688.com/page/offerlist.htmlspm=a26g8.7664812.0.0.R19GYe&memberId=zhtiezhi&sortType=tradenumdown '

但是我的腳本繼續打印頁面的前8個元素,而忽略了滾動時出現的內容。 這是腳本:

# -*- coding: utf-8 -*-
from urllib import urlopen
from bs4 import BeautifulSoup as BS
import unicodecsv as ucsv
import re 
from selenium import webdriver
import time 

with open('list1.csv','wb') as f:
w = ucsv.writer(f, encoding='utf-8-sig')

driver = 
webdriver.Chrome('C:\Users\V\Desktop\PY\web_scrape\chromedriver.exe')
base_url = 'http://m.1688.com/page/offerlist.html?
spm=a26g8.7664812.0.0.R19GYe&memberId=zhtiezhi&sortType=tradenumdown'
driver.get(base_url)
pageSource = driver.page_source
lst = []
for n in range(10): 
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    soup = BS(pageSource, 'lxml')
    container = soup.find('div', {'class' : 'container'})
    items = container.findAll('div', {'class' : 'item-inner'})
    for item in items:
        title = item.find('div', {'class' : 'item-price'}).text
        title_ = ''.join(i for i in title if ord(i) < 128  if i != '\n')
        lst.append(title_)
    print lst
    time.sleep(5)

每個滾動的輸出為:

[u'0.21', u'0.45', u'1.10', u'3.60', u'2.20', u'6.80', u'1.40', u'3.00']
[u'0.21', u'0.45', u'1.10', u'3.60', u'2.20', u'6.80', u'1.40', u'3.00', u'0.21', u'0.45', u'1.10', u'3.60', u'2.20', u'6.80', u'1.40', u'3.00']
[u'0.21', u'0.45', u'1.10', u'3.60', u'2.20', u'6.80', u'1.40', u'3.00', u'0.21', u'0.45', u'1.10', u'3.60', u'2.20', u'6.80', u'1.40', u'3.00', u'0.21', u'0.45', u'1.10', u'3.60', u'2.20', u'6.80', u'1.40', u'3.00']

列表中的第一個滾動具有8個元素,列表的第二個滾動具有16個元素,從第一個滾動中重復了另外8個元素。 其余的滾動也發生同樣的事情。 因此,即使我使用硒滾動站點,該腳本也只返回8個元素,但我希望它在滾動時打印出所有元素。 如果你們給我一些建議,我將不勝感激。

問題出在這部分:

items = container.findAll('div', {'class' : 'item-inner'})
    for item in items:
        title = item.find('div', {'class' : 'item-price'}).text
        title_ = ''.join(i for i in title if ord(i) < 128  if i != '\n')
        lst.append(title_)

每次“滾動” items對象都會大一個塊,因為滾動時,上部內容不會消失。 您需要從items中刪除前n-1 item以免重復。

有兩種可能性:

  1. 讓無限滾動結束然后獲取數據;
  2. 每次重新加載內容后,您可以將現有數據與新數據進行比較,然后將其添加到列表中。

通過將pageSource放入循環中,而不是將Chrome隱藏在任務欄中,您必須打開它,或者可以使用PhantomJS而不是Chrome驅動程序來找到問題的答案。

for n in range(10):
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(2)
pageSource = drive.page_source
soup = BS(pageSource, 'lxml')
container = soup.find('div', {'class' : 'container'})
items = container.findAll('div', {'class' : 'item-inner'})
for item in items:
    title = item.find('div', {'class' : 'item-price'}).text
    title_ = ''.join(i for i in title if ord(i) < 128  if i != '\n')
    lst.append(title_)
print len(lst)

現在輸出將更改,而不是

8
8
8
8

它將打印

16
20
28
...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM