鱼C论坛

 找回密码
 立即注册
查看: 978|回复: 3

[已解决]scrapy爬虫yield重定向的问题

[复制链接]
发表于 2019-2-20 10:06:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

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

x
  1. # -*- coding: utf-8 -*-
  2. import scrapy
  3. from amazoncar import items
  4. from amazoncar.items import AmazoncarItem
  5. from scrapy.http import Request
  6. import re
  7. import time



  8. class AmazonSpider(scrapy.Spider):
  9.     name = 'amazon'
  10.     allowed_domains = ['amazon.com']
  11.     # start_urls = ['https://www.amazon.com/b/ref=sr_aj?node=10677469011&bbn=10677469011&ajr=0']    首先用这个爬取各类汽车分类界面地址

  12.     def start_requests(self):
  13.         urls=['https://www.amazon.com/s/ref=lp_10677469011_nr_p_n_feature_four_bro_0?fst=as%3Aoff&rh=n%3A10677469011%2Cp_n_feature_four_browse-bin%3A11710192011&ie=UTF8',
  14.               'https://www.amazon.com/s/ref=lp_10677469011_nr_p_n_feature_four_bro_1?fst=as%3Aoff&rh=n%3A10677469011%2Cp_n_feature_four_browse-bin%3A11710193011&ie=UTF8',
  15.               'https://www.amazon.com/s/ref=lp_10677469011_nr_p_n_feature_four_bro_2?fst=as%3Aoff&rh=n%3A10677469011%2Cp_n_feature_four_browse-bin%3A11710199011&ie=UTF8']
  16.               # 'https://www.amazon.com/s/ref=lp_10677469011_nr_p_n_feature_four_bro_3?fst=as%3Aoff&rh=n%3A10677469011%2Cp_n_feature_four_browse-bin%3A11710198011&ie=UTF8',
  17.               # 'https://www.amazon.com/s/ref=lp_10677469011_nr_p_n_feature_four_bro_4?fst=as%3Aoff&rh=n%3A10677469011%2Cp_n_feature_four_browse-bin%3A11710200011&ie=UTF8',
  18.               # 'https://www.amazon.com/s/ref=lp_10677469011_nr_p_n_feature_four_bro_5?fst=as%3Aoff&rh=n%3A10677469011%2Cp_n_feature_four_browse-bin%3A11710195011&ie=UTF8',
  19.               # 'https://www.amazon.com/s/ref=lp_10677469011_nr_p_n_feature_four_bro_6?fst=as%3Aoff&rh=n%3A10677469011%2Cp_n_feature_four_browse-bin%3A11710201011&ie=UTF8',
  20.               # 'https://www.amazon.com/s/ref=lp_10677469011_nr_p_n_feature_four_bro_7?fst=as%3Aoff&rh=n%3A10677469011%2Cp_n_feature_four_browse-bin%3A11710197011&ie=UTF8',
  21.               # 'https://www.amazon.com/s/ref=lp_10677469011_nr_p_n_feature_four_bro_8?fst=as%3Aoff&rh=n%3A10677469011%2Cp_n_feature_four_browse-bin%3A11710194011&ie=UTF8',
  22.               # 'https://www.amazon.com/s/ref=lp_10677469011_nr_p_n_feature_four_bro_9?fst=as%3Aoff&rh=n%3A10677469011%2Cp_n_feature_four_browse-bin%3A11710196011&ie=UTF8',
  23.               # 'https://www.amazon.com/s/ref=lp_10677469011_nr_p_n_feature_four_bro_10?fst=as%3Aoff&rh=n%3A10677469011%2Cp_n_feature_four_browse-bin%3A11710202011&&ie=UTF8']

  24.         pages=[26,71,20,20,16,9,14,21,140,85,19]
  25.         #pages=[3,3,3,3,3,3,3,3,3,3,3]



  26.         for url in urls:
  27.             # for i in range(1,pages[i]+1):#11
  28.             #     print(url)
  29.             #     starturl=url+'&page={}'.format(i)
  30.             #     if i==30 or i==60 or i==90 or i==120:
  31.             #         time.sleep(10)
  32.             #     else:
  33.             #         pass
  34.             #     yield scrapy.Request(url=starturl, callback=self.parse)
  35.             yield  scrapy.Request(url,callback=self.parse,dont_filter=True)




  36.     def parse(self, response):  #爬虫逻辑
  37.         # print(response.text[0:100])
  38.         # addlist = []
  39.         # str1='https://www.amazon.com'
  40.         # for i in range(1,12):
  41.         #     addpath=response.xpath('//*[@id="leftNav"]/ul[1]/div/li[{}]/span/span'.format(i)).re("/s.*rnid=11710191011")
  42.         #     addlist.append(str1+addpath[0])
  43.         # print(addlist)   #验证是否成功取得地址
  44.         amzitem = AmazoncarItem()
  45.         maxpage=response.xpath('//*[@id="pagn"]/span[6]').re('>.*<') #.re("data='.*'"))

  46.         if   maxpage:
  47.             maxpage=maxpage[0][1:-1]
  48.         else:
  49.             print(response.url)
  50.             return 0

  51.         #页面产品代号
  52.         m=response.xpath('//*[@id="s-result-count"]/text()').re('\d{1,3}')
  53.         # print(type(m))
  54.         # print(m)
  55.         startnum=int(m[0])-1
  56.         endnum=int(m[1])
  57.         # print(startnum,endnum)

  58.         for n in range(startnum,endnum):#24
  59.             amzitem['body_Style']=response.xpath('//*[@id="s-result-count"]/span/span/text()').extract_first('无显示')
  60.             amzitem['link']=response.xpath('//*[@id="result_{}"]/div/div[3]/div[1]/a/@href'.format(n)).extract_first('无显示')
  61.             maker=response.xpath('//*[@id="result_{}"]/div/div[3]/div[2]/span[2]/text()'.format(n)).extract_first('无显示')
  62.             amzitem['maker']=maker
  63.             print(maker)
  64.             #cats是读取的目标,首先用正则取得year
  65.             cats=response.xpath('//*[@id="result_{}"]/div/div[3]/div[1]/a'.format(n)).re('title=".*" h')[0][7:-3]
  66.             listmodel=cats.split(' ',1)
  67.             amzitem['year']=listmodel[0]
  68.             models=listmodel[1].split(maker+' ')[1]
  69.             amzitem['model']=models
  70.             amzitem['reviews']=response.xpath('//*[@id="result_{}"]/div/div[6]/a/text()'.format(n)).extract_first('无显示')
  71.             if response.xpath('//*[@id="result_{}"]/div/div[6]/span/span/a/i[1]/span/text()'.format(n)).extract_first():
  72.                 rating=response.xpath('//*[@id="result_{}"]/div/div[6]/span/span/a/i[1]/span/text()'.format(n)).extract_first()
  73.                 rating=rating.split(' ')
  74.                 amzitem['rating']=rating[0]
  75.             else:
  76.                 amzitem['rating'] = response.xpath('//*[@id="result_{}"]/div/div[6]/span/span/a/i[1]/span/text()'.format(n)).extract_first('无显示')

  77.             yield amzitem
  78.         next_url=response.xpath('//*[@id="pagnNextLink"]/@href').extract_first()
  79.         if  next_url:
  80.             yield Request('http://www.amazon.com'+next_url,callback=self.parse,dont_filter=True)
复制代码

这是主程序的代码,按编码应该是从初始请求网址列表中,先选择其中一个网址然后爬完该网址下每个下一页,然后返回爬下个列表中网址。
结果代码结果显示爬取的顺序是乱序的,这个爬会爬那个,求大神看下,问题出在哪里


最佳答案
2019-2-20 11:52:27
scrapy本来就是异步爬取的。
如果想要爬取的结果是有序的,那就给数据加个page字段。  
等数据全部爬取下来后,后期再进行索引排序
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-2-20 10:34:37 | 显示全部楼层
yield scrapy.Request()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-2-20 11:23:01 | 显示全部楼层
scrapy不是同步请求的,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-2-20 11:52:27 | 显示全部楼层    本楼为最佳答案   
scrapy本来就是异步爬取的。
如果想要爬取的结果是有序的,那就给数据加个page字段。  
等数据全部爬取下来后,后期再进行索引排序
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-23 12:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表