我一直试图为ebay(大学任务)建立一个小刮刀。我已经弄清了大部分内容,但是我遇到了一个循环问题。
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
网址(从txt文件调度start_urls):
http://www.ebay.com/itm/Mens-Jeans-Slim-Fit-Straight-Skinny-Fit-Denim- Trousers-Casual-Pants-14-color-/221560999664?pt=LH_DefaultDomain_0&var=&hash=item3396108ef0
http://www.ebay.com/itm/New-Apple-iPad-3rd-Generation-16GB-32GB-or-64GB-WiFi-Retina-Display-Tablet-/261749018535?pt=LH_DefaultDomain_0&var=&hash=item3cf1750fa7
我正在运行scrapy版本0.24.6和phantomjs版本2.0。目标是转到网址并从易趣形式中提取变体或属性。 循环开头的if语句用于检查元素是否存在,因为如果selenium找不到元素,则会返回错误的标题错误。我还循环(yield item)因为我需要新行的每个变体。我使用execute_script,因为它比使用xlen的seleniums get元素快100倍。
我遇到的主要问题是scrapy返回项目结果的方式;如果我使用一个url作为我的start_url它就像它应该的那样工作(它以整齐的顺序返回所有项目)。第二个我添加更多的网址我得到一个完全不同的结果我所有的项目都被扰乱,一些项目被多次返回它几乎每次都变化。经过无数次测试后,我注意到产量项目造成了某种问题;所以我删除它并尝试只打印结果,并确定它完美地返回它们。我真的需要一个新行上的每个项目,我唯一能做的就是使用yield item(也许还有更好的方法吗?)。
截至目前,我只是复制粘贴了手动更改xpath选项的循环代码。它的工作方式与预期的一样,但我真的需要能够在将来循环使用项目。如果有人在我的代码中看到错误或更好的尝试方法,请告诉我。所有回复都很有用......
由于
答案 0 :(得分:1)
如果我正确理解你想做什么,我认为这个可以帮助你。
问题是start_urls没有按顺序处理。它们被传递给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)