Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.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 使用Scrapy抓取iTunes图表_Python_Web Scraping_Scrapy_Scrapy Spider - Fatal编程技术网

Python 使用Scrapy抓取iTunes图表

Python 使用Scrapy抓取iTunes图表,python,web-scraping,scrapy,scrapy-spider,Python,Web Scraping,Scrapy,Scrapy Spider,我正在做以下关于使用Scrapy刮取iTunes图表的教程。 本教程有点过时,因为在当前版本的Scrapy中使用的一些语法已被弃用(例如,HtmlXPathSelector、BaseSpider…)——我一直在使用当前版本的Scrapy完成本教程,但没有成功 如果有人知道我做错了什么,我很想知道我需要做什么 items.py from scrapy.item import Item, Field class AppItem(Item): app_name = Field()

我正在做以下关于使用Scrapy刮取iTunes图表的教程。

本教程有点过时,因为在当前版本的Scrapy中使用的一些语法已被弃用(例如,HtmlXPathSelector、BaseSpider…)——我一直在使用当前版本的Scrapy完成本教程,但没有成功

如果有人知道我做错了什么,我很想知道我需要做什么

items.py

from scrapy.item import Item, Field

class AppItem(Item):
    app_name = Field()
    category = Field()
    appstore_link = Field()
    img_src = Field()
苹果蜘蛛

import scrapy
from scrapy.selector import Selector

from apple.items import AppItem

class AppleSpider(scrapy.Spider):
    name = "apple"
    allowed_domains = ["apple.com"]
    start_urls = ["http://www.apple.com/itunes/charts/free-apps/"]

    def parse(self, response):
        apps = response.selector.xpath('//*[@id="main"]/section/ul/li')
        count = 0
        items = []

        for app in apps:

            item = AppItem()
            item['app_name'] = app.select('//h3/a/text()')[count].extract()
            item['appstore_link'] = app.select('//h3/a/@href')[count].extract()
            item['category'] = app.select('//h4/a/text()')[count].extract()
            item['img_src'] = app.select('//a/img/@src')[count].extract()

            items.append(item)
            count += 1

        return items
这是我在运行
scrapy crawl apple
后的控制台消息:

2015-02-10 13:38:12-0500 [scrapy] INFO: Scrapy 0.24.4 started (bot: apple)
2015-02-10 13:38:12-0500 [scrapy] INFO: Optional features available: ssl, http11, django
2015-02-10 13:38:12-0500 [scrapy] INFO: Overridden settings: {'NEWSPIDER_MODULE': 'apple.spiders', '
SPIDER_MODULES': ['apple.spiders'], 'BOT_NAME': 'apple'}
2015-02-10 13:38:12-0500 [scrapy] INFO: Enabled extensions: LogStats, TelnetConsole, CloseSpider, We
bService, CoreStats, SpiderState
2015-02-10 13:38:13-0500 [scrapy] INFO: Enabled downloader middlewares: HttpAuthMiddleware, Download
TimeoutMiddleware, UserAgentMiddleware, RetryMiddleware, DefaultHeadersMiddleware, MetaRefreshMiddle
ware, HttpCompressionMiddleware, RedirectMiddleware, CookiesMiddleware, ChunkedTransferMiddleware, D
ownloaderStats
2015-02-10 13:38:13-0500 [scrapy] INFO: Enabled spider middlewares: HttpErrorMiddleware, OffsiteMidd
leware, RefererMiddleware, UrlLengthMiddleware, DepthMiddleware
2015-02-10 13:38:13-0500 [scrapy] INFO: Enabled item pipelines:
2015-02-10 13:38:13-0500 [apple] INFO: Spider opened
2015-02-10 13:38:13-0500 [apple] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items
/min)
2015-02-10 13:38:13-0500 [scrapy] DEBUG: Telnet console listening on 127.0.0.1:6023
2015-02-10 13:38:13-0500 [scrapy] DEBUG: Web service listening on 127.0.0.1:6080
2015-02-10 13:38:13-0500 [apple] DEBUG: Crawled (200) <GET http://www.apple.com/itunes/charts/free-a
pps/> (referer: None)
2015-02-10 13:38:13-0500 [apple] INFO: Closing spider (finished)
2015-02-10 13:38:13-0500 [apple] INFO: Dumping Scrapy stats:
        {'downloader/request_bytes': 236,
         'downloader/request_count': 1,
         'downloader/request_method_count/GET': 1,
         'downloader/response_bytes': 13148,
         'downloader/response_count': 1,
         'downloader/response_status_count/200': 1,
         'finish_reason': 'finished',
         'finish_time': datetime.datetime(2015, 2, 10, 18, 38, 13, 271000),
         'log_count/DEBUG': 3,
         'log_count/INFO': 7,
         'response_received_count': 1,
         'scheduler/dequeued': 1,
         'scheduler/dequeued/memory': 1,
         'scheduler/enqueued': 1,
         'scheduler/enqueued/memory': 1,
         'start_time': datetime.datetime(2015, 2, 10, 18, 38, 13, 240000)}
2015-02-10 13:38:13-0500 [apple] INFO: Spider closed (finished)
2015-02-10 13:38:12-0500[scrapy]信息:scrapy 0.24.4启动(机器人:苹果)
2015-02-10 13:38:12-0500[scrapy]信息:可选功能:ssl、http11、django
2015-02-10 13:38:12-0500[scrapy]信息:覆盖的设置:{'NEWSPIDER_模块':'apple.spider','
蜘蛛模块“:['apple.SPIDER'],'BOT_NAME':'apple'}
2015-02-10 13:38:12-0500[scrapy]信息:启用的扩展:LogStats、TelnetConsole、CloseSpider、We
bService、CoreStats、SpiderState
2015-02-10 13:38:13-0500[scrapy]信息:启用的下载程序中间件:HttpAuthMiddleware,下载
TimeoutMiddleware、UserAgentMiddleware、RetryMiddleware、DefaultHeadersMiddleware、MetaRefreshMiddle
软件,HttpCompressionMiddleware,重定向中间件,Cookies中间件,ChunkedTransferMiddleware,D
所有者状态
2015-02-10 13:38:13-0500[scrapy]信息:启用的蜘蛛中间件:HttpErrorMiddleware,OffsiteIDD
leware、RefererMiddleware、UrlLengthMiddleware、DepthMiddleware
2015-02-10 13:38:13-0500[scrapy]信息:启用的项目管道:
2015-02-10 13:38:13-0500[苹果]信息:蜘蛛打开
2015-02-10 13:38:13-0500[苹果]信息:抓取0页(以0页/分钟的速度),抓取0项(以0项/分钟的速度
/(分钟)
2015-02-10 13:38:13-0500[scrapy]调试:Telnet控制台监听127.0.0.1:6023
2015-02-10 13:38:13-0500[scrapy]调试:在127.0.0.1:6080上侦听Web服务
2015-02-10 13:38:13-0500[苹果]调试:爬网(200)(参考:无)
2015-02-10 13:38:13-0500[苹果]信息:关闭卡盘(已完成)
2015-02-10 13:38:13-0500[苹果]信息:倾销垃圾统计数据:
{'downloader/request_bytes':236,
“下载程序/请求计数”:1,
“downloader/request\u method\u count/GET”:1,
“downloader/response_字节”:13148,
“下载程序/响应计数”:1,
“下载程序/响应状态\计数/200”:1,
“完成原因”:“完成”,
“完成时间”:datetime.datetime(2015,2,10,18,38,13271000),
“日志计数/调试”:3,
“日志计数/信息”:7,
“响应\u已接收\u计数”:1,
“调度程序/出列”:1,
“调度程序/出列/内存”:1,
“调度程序/排队”:1,
“调度程序/排队/内存”:1,
“开始时间”:datetime.datetime(2015,2,10,18,38,1324000)}
2015-02-10 13:38:13-0500[苹果]信息:蜘蛛关闭(完成)

提前感谢您的帮助/建议

在阅读技术部分之前:确保您没有违反iTunes的使用条款

您遇到的所有问题都在
parse()
回调中:

  • 主xpath不正确(直接在
    部分下没有
    ul
    元素)
  • 您可以直接使用
    response
  • 循环中的xpath表达式应该是特定于上下文的
固定版本:

def parse(self, response):
    apps = response.xpath('//*[@id="main"]/section//ul/li')

    for app in apps:
        item = AppItem()
        item['app_name'] = app.xpath('.//h3/a/text()').extract()
        item['appstore_link'] = app.xpath('.//h3/a/@href').extract()
        item['category'] = app.xpath('.//h4/a/text()').extract()
        item['img_src'] = app.xpath('.//a/img/@src').extract()

        yield item

谢谢你,阿莱克斯!更正是有意义的,但是您能否简单地解释一下为什么在您的代码修订中排除了
count
变量?在没有循环计数器的情况下,这一切是如何实现的(或者更确切地说,循环计数器最初的用途是什么?。@p当然,要理解的关键是
响应
基本上是一个选择器,
app
也是
li
元素的选择器。这里不需要循环索引或计数变量,因为每次迭代中的
app
变量已经是一个特定的
li
元素,我们可以在其中使用
xpath()
进行搜索。我很难解释,但希望这是有意义的。我想我明白了——再次感谢您的及时回复,非常有帮助!干杯