3回答

1收藏

scrapy 疑难求解

问答交流 问答交流 2871 人阅读 | 3 人回复 | 2019-11-28


这是scrapy中的源码 该项目只爬一样调试
scrapy
json
requests
time

..items HousingresourcesspiderItem
..settings *


FsfcSpider(scrapy.Spider):
    name = allowed_domains = []
    p = start_urls = [.format(p)]
    bulid_url = house_api = room_url =spider_time = time.strftime(,time.localtime(time.time()))

    get_total():
        parse(,response):
        .p ==:
            build_ids = response.xpath().extract()
        build_ids:
            build_id build_ids:
            DEFAULT_REQUEST_HEADERS[] = +(.p)
            scrapy.Request(
                =.one_parse,
                =.bulid_url.format(build_id),
                =)

        .p+=DEFAULT_REQUEST_HEADERS[] = +(.p-)
        scrapy.Request(
            =.parse,
            =+(.p),
             = )
        (% (.p-))

    one_parse(,response):
        item = HousingresourcesspiderItem()

        project_name = response.xpath().extract_first()
        project_name :
            item[] =project_name.strip()   :
            item[] = project_area = response.xpath().extract_first()
        project_area :
            item[] =project_area.strip()   :
            item[] = property_deverloper = response.xpath().extract_first()
        property_deverloper :
            item[] = property_deverloper.strip() :
            item[] = admini_area = response.xpath().extract_first()
        admini_area :
            item[] = admini_area.strip()  :
            item[] = gurls = response.xpath().extract()
        builds = response.xpath().extract()
        gurl,build (gurls,builds):
            DEFAULT_REQUEST_HEADERS[] = gurls
            gurl =  +gurl
            item[] = build
            scrapy.Request(
                =.one_page,
                =gurl,
                ={:item},
                =,

            )


    one_page(,response):
        item = response.meta[]

        bid = response.url.split()[-]
        scrapy.Request(
            =.one_page_json,
            =.house_api.format(bid),
            =,
            ={:item}
        )

    one_page_json(,response):
        item = response.meta[]
        room_list = json.loads(response.text)
        room room_list:
            item[] = room[] item[] = room[] item[] = room[] item[] = room[]item[] = room[]item[] = room[]rid = room[]
            DEFAULT_REQUEST_HEADERS[] = .room_url.format(rid)
            scrapy.Request(
                =.two_page,
                =.room_url.format(rid),
                =,
                ={:item}

            )


    two_page(,response):
        DEFAULT_REQUEST_HEADERS[] = response.url
        item = response.meta[]
        selling_prices = response.xpath().extract_first().strip()
        selling_prices selling_prices[] ==selling_prices == :
            selling_prices = item[] = selling_prices
        item[] = .spider_time
        item
        (item)
第一个问题:



像这样我开始运行后要过两三分钟数据才会开始跑,要怎样才能解决,

第二个问题:

开始运行后一些数据总会重复很多次像:



这样的话程序就要很久才能停止 。请问以上的问题是什么原因,要怎么解决?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
分享到:
回复

使用道具 举报

回答|共 3 个

sfhfpc

发表于 2019-11-28 08:44:44 | 显示全部楼层

第二个数据会重复的问题,大概率是因为两个不同的 URL 页面内容相似或者相同。Scrapy 已经有了去重功能,相同的 URL 是不会被请求两次的,出现这种情况通常有两种可能:

1、URL 参数不同,网站都能正常响应,但跳转到的目标页是同一页。
2、URL 不同,但是网页内容相似或相同。
回复

使用道具 举报

杰神荡漾

发表于 2019-11-28 10:05:57 | 显示全部楼层

第一个问题 是因为scrapy默认16个并发吧,一般刚启动处理完16条url你才看到开始存入数据
回复

使用道具 举报

鸢公子

发表于 2020-3-11 18:25:52 | 显示全部楼层


1, 并发量 CONCURRENT_REQUESTS 会在启动时达到并发值,返回一个响应间隔 DOWNLOAD_DELAY 这个时间 再发一个请求(异步:不同时间或同时间返回的多个响应单独计算这个间隔),又由于解析函数继续发请求,排队一直进行着,最后一个解析数据的函数执行完需要一些排队的时间,可以如下解决:
yield scrapy.Request(url, callback=self.parse_item, priority=10) # 提高最后一个解析函数的权重
2, 数据会重复的问题:【三个方向】
# 1, 忽略去重(指url去重)
yield scrapy.Request(url, callback=self.parse_item, dont_filter=True)# 2, 数据传递干扰(线程变量共享,若地址相同出现 item 数据乱入)
item = deepcopy(response.meta['item'])
yield scrapy.Request(url, callback=self.parse_item, meta=deepcopy(item))# 3, 对方数据差不多
观察你代码,第二种居多


回复

使用道具 举报