鱼C论坛

 找回密码
 立即注册
查看: 1167|回复: 2

[已解决]scrapy爬取亚马逊的问题

[复制链接]
发表于 2019-2-19 19:18:49 | 显示全部楼层 |阅读模式

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

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

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




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

  10.     def start_requests(self):
  11.         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',
  12.               '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',
  13.               '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',
  14.               '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',
  15.               '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',
  16.               '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',
  17.               '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',
  18.               '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',
  19.               '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',
  20.               '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',
  21.               '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']

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


  24.         for i in range(0,11):#测试10
  25.             url=urls[i]
  26.             for i in range(1,pages[i]+1):#11
  27.                 print(url)
  28.                 starturl=url+'&page={}'.format(i)
  29.                 yield scrapy.Request(url=starturl, callback=self.parse)




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

  40.         if   maxpage:
  41.             maxpage=maxpage[0][1:-1]
  42.         else:
  43.             print(response.url)
  44.             return 0

  45.         #页面产品代号
  46.         m=response.xpath('//*[@id="s-result-count"]/text()').re('\d{1,3}')
  47.         # print(type(m))
  48.         # print(m)
  49.         startnum=int(m[0])-1
  50.         endnum=int(m[1])
  51.         # print(startnum,endnum)

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

  71.             yield amzitem
复制代码
amazon.py
  1. from openpyxl import Workbook

  2. class AmazoncarPipeline(object):
  3.     def open_spider(self, spider):
  4.     # 创建工作簿,同时页建一个sheet
  5.         self.wb = Workbook()
  6.         # 调用得到的sheet
  7.         self.ws = self.wb.active
  8.         # (注:active返回的是一个列表)
  9.         self.ws.append(['bodyStyle', 'Link', 'Maker','Year', 'Model', 'Reviews', 'Rating'])  # 设置表头

  10.     def process_item(self, item, spider):  # 工序具体内容
  11.         line = [item['body_Style'], item['link'], item['maker'], item['year'],item['model'], item['reviews'], item['rating']]  # 把数据中每一项整理出来
  12.         self.ws.append(line)  # 将数据以行的形式添加到xlsx中
  13.         return item

  14.     def close_spider(self, spider):
  15.         self.wb.save('amazoncar.xlsx')  # 保存xlsx文件
复制代码
pipelines.py




用这个爬虫爬取亚马逊界面时,开始没问题,差不多一个网址超过41页就开始报错,目测估计是返回是亚马逊给的其他导航网址,而不是我要爬的网址导致索引超过

有办法能得到导航网址时重新爬取当前页,不进入下一界面么?
还有用了useragent头,爬虫设置是3秒一次,得到界面错误的原因是什么,怎么检测,麻烦大神指教一下?


最佳答案
2019-2-20 22:15:05
你先确认亚马逊商品的页面大概有多少页。  
或者你直接获取41页,看一下status_code是多少。   

又或者说亚马逊会在41页的时候会突然改变页面或url逻辑来反爬虫。  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-2-20 22:15:05 | 显示全部楼层    本楼为最佳答案   
你先确认亚马逊商品的页面大概有多少页。  
或者你直接获取41页,看一下status_code是多少。   

又或者说亚马逊会在41页的时候会突然改变页面或url逻辑来反爬虫。  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-2-21 08:43:28 | 显示全部楼层
wongyusing 发表于 2019-2-20 22:15
你先确认亚马逊商品的页面大概有多少页。  
或者你直接获取41页,看一下status_code是多少。   

昨天自己调试解决了,商品数量超过一千后,数字加上了逗号,正则爬出来的就不对了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-18 15:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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