[英]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
以免重復。
有兩種可能性:
通過將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.