Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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 刮痕和x2B中的循环问题;硒+;幻影_Python_Loops_Selenium_Scrapy - Fatal编程技术网

Python 刮痕和x2B中的循环问题;硒+;幻影

Python 刮痕和x2B中的循环问题;硒+;幻影,python,loops,selenium,scrapy,Python,Loops,Selenium,Scrapy,我一直在尝试为易趣(大学作业)制作一个小型刮板。我已经解决了大部分问题,但我的循环遇到了问题 from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor from scrapy.selector import HtmlXPathSelector from scrapy.http import Request from selenium import webdriver from selenium.webdriver.commo

我一直在尝试为易趣(大学作业)制作一个小型刮板。我已经解决了大部分问题,但我的循环遇到了问题

from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.selector import HtmlXPathSelector
from scrapy.http import Request
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from loop.items import loopitems

class myProjectSpider(CrawlSpider):
name = 'looper'
allowed_domains = ['ebay.com']
start_urls = [l.strip() for l in open('bobo.txt').readlines()]

def __init__(self):
    service_args = ['--load-images=no',]
    self.driver = webdriver.PhantomJS(executable_path='/Users/localhost/desktop/.bin/phantomjs.cmd', service_args=service_args)

def parse(self, response):
    self.driver.get(response.url)
    item = loopitems()
    for abc in range(2,50):
        abc = str(abc)
        jackson = self.driver.execute_script("return !!document.evaluate('.//div[5]/div[2]/select/option[" + abc + "]', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;")
        if jackson == True:
             item['title'] = self.driver.execute_script("return document.evaluate('.//div[5]/div[2]/select/option[" + abc + "]', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue.textContent;")
             yield item
        else:
             break
URL(起始URL从txt文件发送):

我正在运行scrapy版本0.24.6和phantomjs版本2.0。目标是转到URL并从易趣表单中提取变体或属性。 循环开头的if语句用于检查元素是否存在,因为如果selenium找不到元素,它将返回一个错误的头错误。我还循环(收益项目),因为我需要在新行上的每个变体。我使用execute_脚本,因为它比使用seleniumsget元素的xpath速度快100倍

我遇到的主要问题是scrapy返回项目结果的方式;如果我使用一个url作为我的开始url,它的工作原理应该是一样的(它以整洁的顺序返回所有项目)。第二次我添加了更多的URL,我得到了一个完全不同的结果,我所有的项目都被打乱了,有些项目被多次返回,几乎每次都会发生变化。经过无数次的测试,我注意到收益率项目引起了一些问题;所以我删除了它,试着打印结果,结果确实很完美。我真的需要每一项都放在新的一行上,唯一的方法就是使用收益项(也许有更好的方法?)

到现在为止,我刚刚复制粘贴了循环代码,手动更改了xpath选项。它的工作原理和预期的一样,但我真的需要能够在将来循环浏览项目。如果有人看到我的代码中有错误或者有更好的方法来尝试,请告诉我。所有的回答都很有帮助


谢谢

如果我正确理解了你想做什么,我想这本书可以帮助你

问题是起始URL没有按顺序处理。它们被传递给start_requests方法,并返回一个下载到parse方法的响应。这是异步的

也许这有帮助

#Do your thing
start_urls = [open('bobo.txt').readlines()[0].strip()]
other_urls = [l.strip() for l in open('bobo.txt').readlines()[1:]]
other_urls.reverse()

#Do your thing
def parse(self, response):

    #Do your thing
    if len(self.other_urls) != 0
        url = self.other_urls.pop()
        yield Request(url=url, callback=self.parse)

谢谢Bzisch你的回答帮助我走上了正确的道路。在尝试您的解决方案后,我能够按顺序刮取URL,但我的一些结果仍然不准确,因此将爬网顺序从DFO更改为BFO,并激活Dupefilter_调试(因为一些结果重复)。现在它的工作就像一个魅力。
#Do your thing
start_urls = [open('bobo.txt').readlines()[0].strip()]
other_urls = [l.strip() for l in open('bobo.txt').readlines()[1:]]
other_urls.reverse()

#Do your thing
def parse(self, response):

    #Do your thing
    if len(self.other_urls) != 0
        url = self.other_urls.pop()
        yield Request(url=url, callback=self.parse)