鱼C论坛

 找回密码
 立即注册
查看: 2850|回复: 8

[作品展示] 学了一个多月写个淘宝商品爬虫,是骡子是马也该牵出来溜溜了

[复制链接]
发表于 2018-11-12 23:31:05 | 显示全部楼层 |阅读模式

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

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

x
自认为最满意的作品,大佬勿喷
有些代码看了可能会觉得啰嗦,技术有限也就这样了
不足点麻烦大佬们指出来,下次作品争取更上一层楼
注释部分给小白看的,希望能给你们带来帮助

下面有给大佬们看的没有代码部分

cmd

cmd

csv

csv

图片

图片



有注释的代码没有注释代码分开放,

爬虫文件
  1. # -*- coding: utf-8 -*-
  2. import scrapy
  3. import json
  4. from Taobao.items import TaobaoItem
  5. # url编码
  6. from urllib.parse import quote
  7. # url解码
  8. from urllib.parse import unquote

  9. class TaobaoSpider(scrapy.Spider):
  10.     name = 'taobao'
  11.     # allowed_domains = ['taobao.com/']
  12.     Quote = input('请输入要搜索的商品名>>>')
  13.     pages = input('请输入爬取页数>>>')
  14.     start_urls = []
  15.     page = 0
  16.     ppage = 0
  17.     while page <= int(pages):    # 判断语句要用int类型
  18.         page += 1
  19.         if page%2 != 0:          # 取奇数
  20.             ppage += 1
  21.             # 将符合判断语句的url添加到'start_urls'列表                                                                                                                                                                                                                                                                                                                                                            # 翻页规律       # 第一页,第一个异步加载page参数1,ppage参数为1,pageNav参数为true
  22.             start_urls.append('https://ai.taobao.com/search/getItem.htm?_tb_token_=353a8b5a1b773&__ajax__=1&pid=mm_10011550_0_0&unid=&clk1=&page={}&pageSize=60&ppage={}&squareFlag=&sourceId=search&ppathName=&supportCod=&city=&ppath=&dc12=&pageNav=true&itemAssurance=&fcatName=&price=&cat=&from=&tmall=&key={}&fcat=&debug=false&maxPageSize=200&sort=&exchange7=&custAssurance=&postFree=&npx=50&location='.format(page,ppage,quote(Quote,'utf-8')))
  23.         if page%2 == 0:          # 取偶数
  24.             # 同上将符合判断的url添加到列表                                                                                                                                                                                                                                                                                                                                                                                        #  第一页,第二个异步加载page参数2,ppage为0,pageNav参数为false
  25.             start_urls.append('https://ai.taobao.com/search/getItem.htm?_tb_token_=353a8b5a1b773&__ajax__=1&pid=mm_10011550_0_0&unid=&clk1=&page={}&pageSize=60&squareFlag=&sourceId=search&ppathName=&supportCod=&city=&ppath=&dc12=&pageNav=false&itemAssurance=&fcatName=&price=&cat=&from=&tmall=&key={}&fcat=&ppage=0&debug=false&maxPageSize=200&sort=&exchange7=&custAssurance=&postFree=&npx=50&location='.format(page,quote(Quote,'utf-8')))
  26.     print(start_urls)

  27.     def parse(self, response):
  28.         # 因为在两个js链接中获取数据,(技术有限,数据不会放在同一个文件里)
  29.         # 创建第一个csv文件,注意文件编码格式"encoding=utf-8"否则写数据会乱码
  30.         f1 = open('{}第一部分.csv'.format(self.Quote), 'w', encoding='utf-8')
  31.         f1.write("商品名,价格,店铺网址,图片url\n")
  32.         # 创建第二个csv文件
  33.         f2 = open('{}第二部分.csv'.format(self.Quote), 'w', encoding='utf-8')
  34.         f2.write("商品名,价格,店铺网址,图片url\n")

  35.         a = 0
  36.         # 链接参数中有"pageNav = false"的链接js数据中没有'p4ptop'数据,它也是要爬取的数据
  37.         try:
  38.             # 将js解码,并获取所有链接中有'result'下的'auction'内所有信息
  39.             auction = json.loads(response.body)['result']['auction']
  40.             # 遍历字典'auction'(它里面全是一个一个的列表)
  41.             for x in auction:
  42.                 a += 1
  43.                 # 将要写入csv文件中的数据信息写成字典
  44.                 dict2 = {
  45.                     'name': x['description'],       # 商品名
  46.                     'clickUrl': x['clickUrl'],      # 商品价格
  47.                     'realPrice': x['realPrice'],    # 商品url地址
  48.                     'origPicUrl': x['origPicUrl'],  # 商品图片地址
  49.                 }
  50.                 print('*'*100)
  51.                 print(a)
  52.                 # 数据写入字典中
  53.                 f1.write("{name},{realPrice},{clickUrl},{origPicUrl}\n".format(**dict2))

  54.                 item = TaobaoItem()
  55.                 item['name'] = x['description']
  56.                 item['clickUrl'] = x['clickUrl']
  57.                 item['realPrice'] = x['realPrice']
  58.                 item['origPicUrl'] = x['origPicUrl']

  59.                 yield item

  60.             # 获取所有url中有'result'下的'p4ptop'内所有信息
  61.             p4ptop = json.loads(response.body)['result']['p4ptop']
  62.             for y in p4ptop:
  63.                 a += 1
  64.                 # 同上写入csv文件信息
  65.                 dict = {
  66.                     'name': y['title'],
  67.                     'realPrice': y['salePrice'],
  68.                     'clickUrl' : y['eurl'],
  69.                     'origPicUrl' : y['tbGoodSLink'],
  70.                 }
  71.                 print('*' * 100)
  72.                 print(a)

  73.                 # 同上写入csv文件
  74.                 f2.write("{name},{realPrice},{clickUrl},{origPicUrl}\n".format(**dict))

  75.                 item = TaobaoItem()
  76.                 item['name'] = y['title']
  77.                 item['clickUrl'] = y['eurl']
  78.                 item['realPrice'] = y['salePrice']
  79.                 item['origPicUrl'] = y['tbGoodSLink']
  80.                 # print('=' * 100)
  81.                 # print(a)

  82.                 yield item
  83.         # 如果没有'p4ptop'键则跳过,继续执行下面的代码;(注:搜索包含'auction'的代码不能写在错误下,否则不会跳过报错)
  84.         # 有的js数据没有'p4ptop'会报KeyError错误,跳过继续
  85.         except KeyError:
  86.             pass

  87.         # 关闭文件
  88.         f1.close()
  89.         f2.close()
复制代码


items
  1. # -*- coding: utf-8 -*-

  2. # Define here the models for your scraped items
  3. #
  4. # See documentation in:
  5. # https://doc.scrapy.org/en/latest/topics/items.html

  6. import scrapy


  7. class TaobaoItem(scrapy.Item):
  8.     # 商品名
  9.     name = scrapy.Field()
  10.     # # 价格
  11.     realPrice = scrapy.Field()
  12.     # 商品url
  13.     clickUrl = scrapy.Field()
  14.     # 图片
  15.     origPicUrl = scrapy.Field()

复制代码


管道文件
  1. # -*- coding: utf-8 -*-

  2. # Define your item pipelines here
  3. #
  4. # Don't forget to add your pipeline to the ITEM_PIPELINES setting
  5. # See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html

  6. # 导入处理媒体文件模块
  7. from scrapy.pipelines.images import ImagesPipeline
  8. import scrapy
  9. # 导入同级目录下settings.py代码中设置的下载文件目录
  10. from Taobao.settings import IMAGES_STORE
  11. # 创建文件模块
  12. import os

  13. # 处理媒体文件类
  14. class TaobaoPipeline(ImagesPipeline):
  15.     # 下载图片方法,需在管道文件创建'IMAGES_STORE'文件目录
  16.     def get_media_requests(self, item, info):
  17.         image_link = item['origPicUrl']
  18.         # 将图片链接前面加上https并请求链接
  19.         yield scrapy.Request('https:'+image_link)

  20.     # 重写文件名方法(将下载图片名字改成商品名)
  21.     def item_completed(self, results, item, info):
  22. # ==========================================================
  23.         # 返回results内容
  24.         # print(results)

  25. # [(True,
  26. #     {'url': 'https://gaitaobao4.alicdn.com/tfscom/i3/1607379596/O1CN01vv4Zlp2Kl17e4jX7T_!!0-item_pic.jpg',
  27. #         'path': 'full/321e6d31eed0d9fd036968547943219104c6ab4c.jpg',
  28. #         'checksum': 'ca4e396b135ea49bb2a66c4d8806f6fd'}
  29. #         )]'

  30. # ==========================================================
  31.         # 三元操作;判断'ok'是否为'True',为真则获取字典内'path'的值
  32.         path = [x['path'] for ok, x in results if ok]
  33.         # split()分割,提取文件后缀
  34.         jpg = [x['path'] for ok, x in results if ok][0].split('.')[-1]
  35.         # 因为商品名有'/',需要替换掉才能保存文件,要不然会被认为下一级
  36.         names = item['name'].replace('/','')
  37.         # rename()文件名修改函数;
  38.         # 有些图片链接挂了,在'results'里可以看到状态为False;执行时会提示文件保存失败或索引超出范围
  39.         # path[0]即文件目录,'path': 'full/321e6d31eed0d9fd036968547943219104c6ab4c.jpg'
  40.         # jpg即提取的所有图片格式
  41.         os.rename(IMAGES_STORE + path[0],IMAGES_STORE + names + '.' + jpg)
  42.         # 返回
  43.         return item
复制代码


settings.py
  1. BOT_NAME = 'Taobao'

  2. SPIDER_MODULES = ['Taobao.spiders']
  3. NEWSPIDER_MODULE = 'Taobao.spiders'

  4. # 设置图片下载目录
  5. IMAGES_STORE = 'E:/Scrapy/Taobao/Taobao/spiders/img/'

  6. # 设置U-A
  7. USER_AGENT = 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)'

  8. # 管道文件配置
  9. ITEM_PIPELINES = {
  10.    'Taobao.pipelines.TaobaoPipeline': 300,
  11. }
复制代码





没有注释的代码,item、settings两个文件看上面的吧

爬虫文件

  1. # -*- coding: utf-8 -*-
  2. import scrapy
  3. import json
  4. from Taobao.items import TaobaoItem
  5. from urllib.parse import quote
  6. class TaobaoSpider(scrapy.Spider):
  7.     name = 'taobao'
  8.     Quote = input('请输入要搜索的商品名>>>')
  9.     pages = input('请输入爬取页数>>>')
  10.     start_urls = []
  11.     page = 0
  12.     ppage = 0
  13.     while page <= int(pages):   
  14.         page += 1
  15.         if page%2 != 0:         
  16.             ppage += 1
  17.             start_urls.append('https://ai.taobao.com/search/getItem.htm?_tb_token_=353a8b5a1b773&__ajax__=1&pid=mm_10011550_0_0&unid=&clk1=&page={}&pageSize=60&ppage={}&squareFlag=&sourceId=search&ppathName=&supportCod=&city=&ppath=&dc12=&pageNav=true&itemAssurance=&fcatName=&price=&cat=&from=&tmall=&key={}&fcat=&debug=false&maxPageSize=200&sort=&exchange7=&custAssurance=&postFree=&npx=50&location='.format(page,ppage,quote(Quote,'utf-8')))
  18.         if page%2 == 0:  
  19.             start_urls.append('https://ai.taobao.com/search/getItem.htm?_tb_token_=353a8b5a1b773&__ajax__=1&pid=mm_10011550_0_0&unid=&clk1=&page={}&pageSize=60&squareFlag=&sourceId=search&ppathName=&supportCod=&city=&ppath=&dc12=&pageNav=false&itemAssurance=&fcatName=&price=&cat=&from=&tmall=&key={}&fcat=&ppage=0&debug=false&maxPageSize=200&sort=&exchange7=&custAssurance=&postFree=&npx=50&location='.format(page,quote(Quote,'utf-8')))
  20.     print(start_urls)

  21.     def parse(self, response):
  22.         f1 = open('{}第一部分.csv'.format(self.Quote), 'w', encoding='utf-8')
  23.         f1.write("商品名,价格,店铺网址,图片url\n")
  24.       
  25.         f2 = open('{}第二部分.csv'.format(self.Quote), 'w', encoding='utf-8')
  26.         f2.write("商品名,价格,店铺网址,图片url\n")
  27.         
  28.         a = 0
  29.         try:
  30.             auction = json.loads(response.body)['result']['auction']
  31.             for x in auction:
  32.                 a += 1

  33.                 dict2 = {
  34.                     'name': x['description'],       # 商品名
  35.                     'clickUrl': x['clickUrl'],      # 商品价格
  36.                     'realPrice': x['realPrice'],    # 商品url地址
  37.                     'origPicUrl': x['origPicUrl'],  # 商品图片地址
  38.                 }

  39.                 f1.write("{name},{realPrice},{clickUrl},{origPicUrl}\n".format(**dict2))

  40.                 item = TaobaoItem()
  41.                 item['name'] = x['description']
  42.                 item['clickUrl'] = x['clickUrl']
  43.                 item['realPrice'] = x['realPrice']
  44.                 item['origPicUrl'] = x['origPicUrl']

  45.                 yield item

  46.             p4ptop = json.loads(response.body)['result']['p4ptop']
  47.             for y in p4ptop:
  48.                 a += 1

  49.                 dict = {
  50.                     'name': y['title'],
  51.                     'realPrice': y['salePrice'],
  52.                     'clickUrl' : y['eurl'],
  53.                     'origPicUrl' : y['tbGoodSLink'],
  54.                 }

  55.                 f2.write("{name},{realPrice},{clickUrl},{origPicUrl}\n".format(**dict))

  56.                 item = TaobaoItem()
  57.                 item['name'] = y['title']
  58.                 item['clickUrl'] = y['eurl']
  59.                 item['realPrice'] = y['salePrice']
  60.                 item['origPicUrl'] = y['tbGoodSLink']

  61.                 yield item

  62.         except KeyError:
  63.             pass

  64.         f1.close()
  65.         f2.close()
复制代码


管道文件

  1. # 导入处理媒体文件模块
  2. from scrapy.pipelines.images import ImagesPipeline
  3. import scrapy
  4. from Taobao.settings import IMAGES_STORE
  5. import os

  6. class TaobaoPipeline(ImagesPipeline):
  7.     def get_media_requests(self, item, info):
  8.         image_link = item['origPicUrl']
  9.         yield scrapy.Request('https:'+image_link)

  10.     def item_completed(self, results, item, info):
  11.         path = [x['path'] for ok, x in results if ok]
  12.         jpg = [x['path'] for ok, x in results if ok][0].split('.')[-1]
  13.         names = item['name'].replace('/','')
  14.         os.rename(IMAGES_STORE + path[0],IMAGES_STORE + names + '.' + jpg)
  15.         return item
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-11-12 23:35:08 | 显示全部楼层
settings.py文件的图片存放目录不能改,要是能改还能把图片分别存放不同文件,有没有大佬能指点一二的(Scrapy框架)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-14 08:25:26 From FishC Mobile | 显示全部楼层
为啥没人看啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-14 09:25:04 | 显示全部楼层
过来顶一下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-14 16:47:35 | 显示全部楼层
过来暖下帖,新人还看不懂
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-14 17:00:52 | 显示全部楼层
淫才啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-23 16:38:10 | 显示全部楼层
老哥可以的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-19 11:48:22 | 显示全部楼层
过来顶一下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-1 23:51:35 | 显示全部楼层
学习了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-20 23:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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