Scrapy 初体验

时间:2022-06-08 19:46:26

开发笔记

Scrapy 初体验

  • scrapy startproject project_name 创建工程

  • scrapy genspider -t basic spider_name website.com 以basic模版创建爬虫

  • ROBOTSTXT_OBEY = False 不遵守Robots协议

  • Item 添加字段

  • 添加pipeline用于Item处理(输出到屏幕/数据/json)

  • 配置pipeline dangdang.pipelines.DangdangPipeline': 300

  • 添加爬取逻辑 : def parse(self, response):

  • scrapy crawl spider_name —nolog 启动爬虫

PyCharm中启动爬虫调试

命令行执行 scrapy crawler spider启动爬虫,其实与下面指令是一样的:

python C:\Python34\Lib\site-packages\scrapy\cmdline.py crawl spider_name

的效果是一样的

这样只需要在pycharm中的Run下Edit Configurations…中做运行配置即可:

Script: C:\Python34\Lib\site-packages\scrapy\cmdline.py

Script parameters: crawl spider_name

XPath

  1. /div[@attr='xxxx'] 选择属性为xxxx的div标签
  2. a/@title.extract() 输出a标签内的title属性值
  3. a/text() 取标签文本
  4. print ("title : " + p.xpath('dl/dd/a/@title').extract())
  5. print("link : " + p.xpath('dl/dd/a/@href').extract())
  6. print("price : " + p.xpath('dl/dd/span/text()').extract()) 取标签文本
  7. print("logo : " + p.xpath('a/img[@onerror="imgerror(event)"]/@src').extract())
  8. print("link : " + p.xpath('dl/dd/a/@href').extract())

趣玩网

创建工程

  1. scrapy startproject quwan
  2. scrapy genspider -t basic QuwanSpider quwan.com
  3. ROBOTSTXT_OBEY = False

首页html分析规律

480x480大方块

  1. brick col2 masonry-brick 专题定位
  2. //div[@class=='brick col2 masonry-brick'] 专题定位
  3. /a/@href 专题详情页link (存在不完整连接)
  4. /a/img[@onerror="imgerror(event)"]/@src 专题头像link

235x235小方块

  1. brick col1 commodity bestlikes masonry-brick 商品定位
  2. //div[@class='brick col1 commodity bestlikes masonry-brick'] 商品定位
  3. /a/@href 商品详情页link (存在不完整连接)
  4. /a/@title 名称
  5. /a/img[@onerror="imgerror(event)"]/@src 商品头像link
  6. /dl/dd/a/@href 商品详情页link (存在不完整连接)
  7. /dl/dd/a/@title 名称
  8. /dl/dd/span.text() 价格

滚动交互区域

brick col1 userActive

一键回顶部

goTop_box

商品详情页分析及提取

  1. 缩略图特效区域
  2. //a[@class="cloud-zoom"]/@href 缩略大图1
  3. //a[@class="cloud-zoom"]/img/@src 缩略大图2
  4. //ul[@class="pic_index"]/li[@class="pic_li"]/img/@src 缩略小图
  5. //div[@id="paykey_new"]//ul/li/dl/dt 品牌
  6. //div[@class="product_mess"] //商品信息
  7. //div[@class="mess_box"] //商品信息
  8. //div[@class="box details"]/p/img/@src 商品图片详情,多图组成
  9. //div[@class="gn_decri"]/p/text() 商品介绍文本

商品Item对象字段定义

  1. class QuwanItem(scrapy.Item):
  2. # define the fields for your item here like:
  3. # name = scrapy.Field()
  4. goods_id = scrapy.Field() #商品id
  5. page_id = scrapy.Field() #商品索引页
  6. logo = scrapy.Field() #商品列表logo
  7. price = scrapy.Field()
  8. title = scrapy.Field()
  9. brand = scrapy.Field() #品牌
  10. pic_zoom_b1 = scrapy.Field() #缩略大图1
  11. pic_zoom_b2 = scrapy.Field() #缩略大图2
  12. pic_zoom_m = scrapy.Field() #缩略小图
  13. pic_des = scrapy.Field() #商品详情图
  14. goods_des = scrapy.Field() #商品文本简介
  15. params_name = scrapy.Field() #参数
  16. params_val = scrapy.Field()

坑爹的item

item.goods_id = "xxxx" 不能这样访问

item['goods_id'] = "xxxx" 非得这样访问

  1. yield item 返回item对象
  2. 安装加工管道逐个处理item
  3. ITEM_PIPELINES = {
  4. 'quwan.pipelines.QuwanPipeline': 300,
  5. }

DB 数据持久化

使用SQLAlchemy教程

页面表

页面id, 商品id

图片表

商品id, 图片顺序号, 图片链接, 图片类型(logo,缩放图,产品详情图)

商品信息表

商品id,价格、名称、参数、赞数量

需要考虑扩展的部分

  • 品牌
  • 好评指数
  • 库存&到货通知
  • 点赞喜欢
  • 放上自己的微信二维码
  • 分享链接可以考虑是否添加上

问题点

  • 首页–详情,产品ID如何匹配?
  • 数据库,手动建库还是对象映射,json?
  • 缩略图特效支持
  • Scrapy 如何多线程