scrapy request meta参数使用的问题

guistory 2016-01-06 10:54:42
# -*- coding: utf-8 -*-
import scrapy
from scrapy.http import Request
from hbzc.items import HbzcItem


class HbzcsSpider(scrapy.Spider):
name = "hbzcs"
city = '?citycode=130000000-130700000-130728000&cityname=河北省张家口市怀安县'
allowed_domains = ["www.ccgp-hebei.gov.cn"]
start_urls = (
'http://www.ccgp-hebei.gov.cn/zfcg/web/getPreWinAnncList_1.html'+city,#预中标公告列表

)

def parse(self, response):
sel = response.xpath
htm = '.html'
prehtm = 'http://www.ccgp-hebei.gov.cn/zfcg/preBidingAnncDetail_'
prehtmlist =[prehtm+h+htm for h in [t[1] for t in [i.split("'") for i in sel('//*[@id="moreprewinannctable"]/tr/@onclick').extract()]]]#预中标公告详细
for preurl in prehtmlist:
yield Request(preurl,callback=self.parse_item)

def parse_item0(self,response):
sel = response.xpath
htm = '.html'
dinghtm = 'http://www.ccgp-hebei.gov.cn/zfcg/1/bidingAnncDetail_'
dinghtmlist = [dinghtm+h+htm for h in [t[1] for t in [i.split("'") for i in sel('//*[@id="moredingannctable"]/tr/@onclick').extract()]]]#招标公告详细
for dingurl in dinghtmlist:
item = response.meta['item']
#print dingurl
yield Request(url=dingurl,callback=self.parse_item1,meta={'item':item})

def parse_item(self,response):
sel = response.xpath
item = HbzcItem()
item['fs'] = sel('/html/body/table/tr/td/table/tr[4]/td/table/tr[1]/td/table/tr[1]/td[4]/text()').extract()
item['dl'] = sel('/html/body/table/tr/td/table/tr[4]/td/table/tr[1]/td/table/tr[3]/td[6]/text()').extract()
item['zb'] = sel('/html/body/table/tr/td/table/tr[4]/td/table/tr[7]/td/span/span[1]/text()').extract()
item['mc'] = sel('/html/body/table/tr/td/table/tr[4]/td/table/tr[1]/td/table/tr[2]/td[2]/text()').extract()
#这里出现问题,导致以上ITEM获取的值是一个项目的
return Request('http://www.ccgp-hebei.gov.cn/zfcg/web/getBidingList_1.html?citycode=130000000-130700000-130728000',callback=self.parse_item0,meta={'item':item})


def parse_item1(self,response):
sel = response.xpath
item = response.meta['item']
item['ys'] = sel('/html/body/table/tr/td/table/tr[4]/td/table/tr[7]/td/span/span[8]/text()').extract()
item['kb'] = sel('//*[@id="bidopentime2"]/text()').extract()
print item
return item
...全文
2060 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
so恒久 2019-09-28
  • 打赏
  • 举报
回复
为啥我的还是不行,对meta深度复制后得的键值对顺序还是乱的,而且还出现了很多重复的
JeroYang 2018-08-20
  • 打赏
  • 举报
回复
引用 6 楼 u011737058 的回复:
解决了 ,楼上说的深度拷贝 是copy.deepcopy()吧,而且不是在接收的时候拷贝。
是在yield传递的时候深度拷贝值

import copy
yield scrapy.Request(full_detail_url,callback=self.detail_page,meta={'item': copy.deepcopy(item))


找了好久,终于找到正解了
PYr_Lee 2018-06-24
  • 打赏
  • 举报
回复
解决了 ,楼上说的深度拷贝 是copy.deepcopy()吧,而且不是在接收的时候拷贝。
是在yield传递的时候深度拷贝值

import copy
yield scrapy.Request(full_detail_url,callback=self.detail_page,meta={'item': copy.deepcopy(item))
PYr_Lee 2018-06-24
  • 打赏
  • 举报
回复
我也遇到这个问题了,meta放入参数前都是正常的,在下一个函数 response.meta['item'] 接收后真实活见鬼了,小白。。。搞了好几天了都,楼上说的深拷贝 也不行啊,话说楼主怎么解决的?
llyon 2017-05-27
  • 打赏
  • 举报
回复
def parse_item1(self,response): sel = response.xpath item = response.meta['item'].copy() item['ys'] = sel('/html/body/table/tr/td/table/tr[4]/td/table/tr[7]/td/span/span[8]/text()').extract() item['kb'] = sel('//*[@id="bidopentime2"]/text()').extract() print item return item 使用深拷贝,保证内容的独立性
qq_28147505 2016-08-09
  • 打赏
  • 举报
回复
请问如何解决这个问题。找了那么久都没找到原因
iBaiQue 2016-07-21
  • 打赏
  • 举报
回复
meta (dict) – Request.meta 属性的初始值。 一旦此参数被设置, 通过参数传递的字典将会被浅拷贝。
NetCop 2016-02-24
  • 打赏
  • 举报
回复
我也遇到同样的问题,求解!

37,719

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧