Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用selenium和beautifulsoup返回重复元素,通过无限滚动来刮取网站_Python_Selenium_Web Scraping_Beautifulsoup - Fatal编程技术网

Python 使用selenium和beautifulsoup返回重复元素,通过无限滚动来刮取网站

Python 使用selenium和beautifulsoup返回重复元素,通过无限滚动来刮取网站,python,selenium,web-scraping,beautifulsoup,Python,Selenium,Web Scraping,Beautifulsoup,所以我有一个脚本,它使用Selenium和BeautifulSoup来抓取这个网站: '' 但是我的脚本一直在打印页面的前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 tim

所以我有一个脚本,它使用Selenium和BeautifulSoup来抓取这个网站: ''

但是我的脚本一直在打印页面的前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)
第一次滚动列表有8个元素,第二次滚动列表有16个元素,额外的8个元素从第一次滚动开始重复。其余的卷轴也会发生同样的情况。
因此,即使我使用selenium滚动站点,脚本也只返回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=container.findAll('div',{'class':'item-inner'})
对于项目中的项目:
title=item.find('div',{'class':'item price'}).text
标题\=''.join(如果ord(i)<128如果i!='\n',则标题中的i表示i)
附加标题(标题)
每次“滚动”时,
对象会变大一个块,因为滚动时,上面的内容不会消失。
您需要从
项中删除第一个
n-1
s以避免重复。

有两种可能性:

  • 让无限滚动完成,然后获取数据
  • 每次内容重新加载后,可以将已有数据与新数据进行比较,然后将其添加到列表中

  • 我已经找到了问题的答案,将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)
    
    它会打印出来

    16
    20
    28
    ...
    

    这不是问题,因为如果你看一下列表,最后一个列表包含相同的8个元素,比如lst3=3*lst1,没有任何变化。但我不知道什么时候停止滚动,一定有一个限制。好吧,取决于页面…例如,如果你开始滚动VK.com提要页面,如果你有很多朋友,然后,提要页面将持续很长时间=),这也取决于您想要多少内容。这里的好处是,您可以手动限制迭代次数并获得所需的内容。实际上,你可以在
    上为
    循环替换
    ,而
    并有一天到达页面内容的末尾=)我理解这个概念,我不知道如果脚本不再能够滚动,是否会出现某种错误。你可以使用
    try-except
    子句预测任何错误,并在这种情况。在无限滚动之后,页面变得如此沉重,以至于崩溃并失败。
    8
    8
    8
    8
    
    16
    20
    28
    ...