【发布时间】:2016-08-10 09:17:25
【问题描述】:
我声明我已经阅读了一些关于同一问题的答案,但我无法解决我的问题。 我是 Python 新手,我正在尝试从 Aptoide 中提取有关应用程序和商店的数据,并且我想要输出结果为 .json 文件(或 csv),但我得到的文件是空的,我不知道原因。
这是我的代码:
import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.selector import HtmlXPathSelector
class ApptoideItem(scrapy.Item):
app_name = scrapy.Field()
rating = scrapy.Field()
security_status = scrapy.Field()
good_flag = scrapy.Field()
licence_flag = scrapy.Field()
fake_flag = scrapy.Field()
freeze_flag = scrapy.Field()
virus_flag = scrapy.Field()
five_stars = scrapy.Field()
four_stars = scrapy.Field()
three_stars = scrapy.Field()
two_stars = scrapy.Field()
one_stars = scrapy.Field()
info = scrapy.Field()
download = scrapy.Field()
version = scrapy.Field()
size = scrapy.Field()
link = scrapy.Field()
store = scrapy.Field()
class AppSpider(CrawlSpider):
name = "second"
allowed_domains = ["aptoide.com"]
start_urls = [ "http://www.aptoide.com/page/morestores/type:top" ]
rules = (
Rule(LinkExtractor(allow=(r'\w+\.store\.aptoide\.com$'))),
Rule(LinkExtractor(allow=(r'\w+\.store\.aptoide\.com/app/market')), callback='parse_item')
)
def parse_item(self, response):
item = ApptoideItem()
item['app_name']= str(response.css(".app_name::text").extract()[0])
item['rating']= str(response.css(".app_rating_number::text").extract()[0])
item['security_status']= str(response.css("#show_app_malware_data::text").extract()[0])
item['good_flag']= int(response.css(".good > div:nth-child(3)::text").extract()[0])
item['licence_flag']= int(response.css(".license > div:nth-child(3)::text").extract()[0])
item['fake_flag']= int(response.css(".fake > div:nth-child(3)::text").extract()[0])
item['freeze_flag']= int(response.css(".freeze > div:nth-child(3)::text").extract()[0])
item['virus_flag']= int(response.css(".virus > div:nth-child(3)::text").extract()[0])
item['five_stars']= int(response.css("div.app_ratting_bar_holder:nth-child(1) > div:nth-child(3)::text").extract()[0])
item['four_stars']= int(response.css("div.app_ratting_bar_holder:nth-child(2) > div:nth-child(3)::text").extract()[0])
item['three_stars']= int(response.css("div.app_ratting_bar_holder:nth-child(3) > div:nth-child(3)::text").extract()[0])
item['two_stars']= int(response.css("div.app_ratting_bar_holder:nth-child(4) > div:nth-child(3)::text").extract()[0])
item['link']= response.url
item['one_stars']= int(response.css("div.app_ratting_bar_holder:nth-child(5) > div:nth-child(3)::text").extract()[0])
item['download']= int(response.css("p.app_meta::text").re('(\d[\w\.]*)')[0].replace('.', ''))
item['version']= str(response.css("p.app_meta::text").re('(\d[\w\.]*)')[1])
item['size']= str(response.css("p.app_meta::text").re('(\d[\w\.]*)')[2])
item['store_name']= str(response.css(".sec_header_txt::text").extract()[0])
item['info_store']= str(response.css(".ter_header2::text").extract()[0])
yield item
我很确定问题是从未调用过 parse_item 方法,我不知道原因。第一条规则遵循商店,而第二条规则遵循商店中的应用程序。我觉得正则表达式的语法是对的。
设置是:
CLOSESPIDER_PAGECOUNT = 1000
CLOSESPIDER_ITEMCOUNT = 500
CONCURRENT_REQUESTS = 1
CONCURRENT_ITEMS = 1
BOT_NAME = 'nuovo'
SPIDER_MODULES = ['nuovo.spiders']
NEWSPIDER_MODULE = 'nuovo.spiders'
谁能找到问题并建议我解决方案?
【问题讨论】:
-
您是否检查过您的 xpath 表达式是否通过
scrapy shell工作?输出是否可能来自JavaScript?此外,scrapy提供了一个名为extract_first()的方法,因此您无需摆弄索引。
标签: python json regex scrapy rule