scrapy框架爬取豆瓣多级页面返回的item只有重复的一个怎么办

问题描述

scrapy框架爬取豆瓣多级页面返回的item只有重复的一个。
scrapy框架爬取豆瓣多级页面返回的item只有重复的一个怎么办
name 和 url 一直重复
name_name 却是不同的

问题出现的环境背景及自己尝试过哪些方法

相关代码

// 请把代码文本粘贴到下方(请勿用图片代替代码)

-- coding: utf-8 --

from scrapy import Request
from scrapy.spiders import Spider
from douban.items import DoubanItem
import base64
import scrapy
import random

class DoubantopSpider(scrapy.Spider):

name = 'doubantop'

allowed_domains = ['www.douban.com']

start_urls = ['https://movie.douban.com/top250']

def __init__(self):

self.cookie_list = ["admckid=1906171310331198387; mapping_hist=szeJ.T00tKLdY.NDU.NjKxNLIw1NNLTylB5efnp-ekIgkBAEs1DLA*; admses=1626438861126; viewlist=szeJx9kgtuhEAMQ280Sp.__S9W.5bd0g6qhECgN8Z2spYi2mWZxbTYkqWRBh80lvLVUwKjMovowLHMJ0fkjfK4-gPq5stCEKYXGlI-cqKBShqQ7Mw7OieaECXa4u4_aPDjaUA8t1c-cKGVJPpATToYK7KL__wXRWcZVZuuL68OCZ96UIUWVV2A-KDpmqdq7TjmyOwPyls9xUrv3evwuqH9OIJ8oSZ-TcttIAxwGhDbaNbY1asH7ciT16Etbovoe1ovVHn-L-pdsQwZ2npXfShLxYaq1cAv1Vk4UGAbaBaAO3ruK4NjL2HUfEbwQs-yTGq2aqap3dGHBnpme2019Dca7CJY1i-vXwGTqh0*"]

def parse(self, response):

item = DoubanItem()

headers = {

"Accept": "*/*",

"Connection": "keep-alive",
"Cookie": random.choice(self.cookie_list),
"Host": "v.admaster.com.cn",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3650.400 QQBrowser/10.4.3341.400",
"referer": "https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-4830389020085397&output=html&h=250&slotname=1983604743&adk=4099574729&adf=1507960138&w=300&guci=2.2.0.0.2.2.0.0&format=300x250&url=https%3A%2F%2Fmovie.douban.com%2Ftop250&ea=0&flash=27.9.9&avail_w=300&wgl=1&dt=1565759450196&bpp=31&bdt=168&fdt=50&idt=50&shv=r20190812&cbv=r20190131&saldr=aa&correlator=7855527373646&frm=23&ife=1&pv=2&ga_vid=1088545587.1560920881&ga_sid=1565759291&ga_hid=1300788390&ga_fc=1&iag=3&icsg=40&nhd=1&dssz=4&mdo=0&mso=0&u_tz=480&u_his=2&u_java=0&u_h=1080&u_w=1920&u_ah=1040&u_aw=1920&u_cd=24&u_nplug=5&u_nmime=35&adx=1172&ady=328&biw=1903&bih=945&isw=300&ish=250&ifk=3956660937&scr_x=0&scr_y=0&eid=20199336%2C151527007%2C368226951%2C368226961%2C410075105&oid=3&rx=0&eae=2&fc=656&brdim=0%2C95%2C0%2C95%2C1920%2C0%2C1920%2C945%2C300%2C250&vis=1&rsz=%7C%7CoeE%7C&abl=CS&pfx=0&fu=28&bc=31&osw_key=1268507751&ifi=1&uci=1.ps3g6ubp5ree&fsb=1&dtd=72"

    }

movies = response.xpath('//ol[@class="grid_view"]/li')

'''print(movies)'''

for movie in movies: #一级页面的总父级

item['name'] = movie.xpath('.//div[@class="hd"]/a/span[1]/text()').extract()[0]#一级页面的电影名

item['url'] = movie.xpath('.//div[@class="hd"]/a/@href').extract()[0]#一级页面电影的url

url = movie.xpath('.//div[@class="hd"]/a/@href').extract()[0]

'''yield item'''

yield scrapy.Request(item['url'], meta={'item':item}, callback=self.book_name, dont_filter=True)

def book_name(self,response):

item = response.meta['item']

index_list = response.xpath('.//div[@id="content"]')#响应二级页面的电影页面

for comment in index_list:

item['name_name'] = comment.xpath('.//h1/span[1]/text()').extract_first()#二级电影页面中的电影名字

name_name = comment.xpath('.//h1/span[1]/text()').extract_first()#重复上一条忽略不计

return item

怎么解决啊 我贴的这个代码 中间headers没有连接起来 不会弄 精良看吧 谢各位大神给我指点一下啊


回答:

为什么要 for comment in index_list: ?


回答:

我还要纠正下 。本来我的 第一个 item['name']是一级页面电影名的列表 但是加上第二个def book_name后第一个def方法只一直重复抓取这一页最后的那部电影名字和url ,第二个def方法成了抓取一级页面的名字了。我搞不懂了


回答:

是深浅copy导致的,我不是专精python,也不是很懂,但是你这么搞试试

import copy

yield scrapy.Request(item['url'], meta={'item':item}, callback=self.book_name, dont_filter=True)

# 改成

yield scrapy.Request(item['url'], meta={'item':copy.deepcopy(item)}, callback=self.book_name, dont_filter=True)

参考:
https://blog.csdn.net/bestbzw...

以上是 scrapy框架爬取豆瓣多级页面返回的item只有重复的一个怎么办 的全部内容, 来源链接: utcz.com/a/160606.html

回到顶部