• 利用scrapy库采集数据信息


    关注 码龄 粉丝数 原力等级 -- 被采纳 被点赞 采纳率 2401_83481032 2024-05-27 16:45 采纳率: 0% 浏览 11 首页/ 编程语言 / 利用scrapy库采集数据信息 python 采集软件用pycharm来实现 需求:利用scrapy库采集数据信息,采集地址如下https://developer.alivun.com/bigdata/?spm=a2c6h.17735062.dctail.202.32271eb39LGDXT 要求:1-采集数据共50页包含【社区分享标题+查看数+点赞数+收藏数+发表日期(注:年月日分别存储)+发表地址】第一个页面:点击标题进行跳转到第二个页面2-发布地址只留下具体地区,如发布于北京精简为北京3-清除点赞数为0的社区分享4-采集的数据,按照要求1的显示顺序输出并存储为csy 文件【注:使用管道进行文件结构存储】5-采集并清洗后的数据存储到MySOL数据库 收起 写回答 好问题 0 提建议 追加酬金 关注问题 微信扫一扫 点击复制链接 分享 邀请回答 编辑 收藏 删除 结题 收藏 举报 追加酬金 (90%的用户在追加酬金后获得了解决方案) 当前问题酬金 ¥ 0 (可追加 ¥500) ¥ 15¥ 20¥ 50¥ 100¥ 200 支付方式 扫码支付 二维码出错 点击刷新 支付金额 15 元 提供问题酬金的用户不参与问题酬金结算和分配 支付即为同意 《付费问题酬金结算规则》 结题 再想想 删除 再等等

    1条回答 默认 最新

    • 普通网友 Java领域优质创作者 2024-05-27 16:53
      关注
      让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
      问题分析: 本题要求采集指定网站的数据信息,并对数据进行清洗和存储。其中采集的数据包括社区分享标题、查看数、点赞数、收藏数、发表日期和发表地址。需要注意的是,发表地址只保留具体地区,点赞数为0的社区分享需要清除掉。最后,采集并清洗后的数据需要存储到MySQL数据库中。 解决方案:
      1. 使用Scrapy框架进行数据采集,定义Item结构体,包括要采集的字段。 示例代码:
      import scrapy
      class BigdataItem(scrapy.Item):
          title = scrapy.Field() # 社区分享标题
          views = scrapy.Field() # 查看数
          likes = scrapy.Field() # 点赞数
          collects = scrapy.Field() # 收藏数
          pubDate = scrapy.Field() # 发表日期
          pubLocation = scrapy.Field() # 发表地址
      
      1. 在Spider中设置要采集的URL,并定义回调函数解析每个页面中的社区分享信息。同时,需要采集50页数据,可以使用for循环动态生成URL。 示例代码:
      import scrapy
      from bigdata.items import BigdataItem
      import re
      class BigdataSpider(scrapy.Spider):
          name = "bigdata"
          start_urls = ['https://developer.alivun.com/bigdata/?page=1']
          custom_settings = {
              'ITEM_PIPELINES': {'bigdata.pipelines.BigdataPipeline': 300},
              'DOWNLOAD_DELAY': 1, # 设置下载延迟,防止被封IP
          }
          def parse(self, response):
              for sel in response.xpath('//ul[@class="post-list"]/li'):
                  item = BigdataItem()
                  item['title'] = sel.xpath('h2/a/text()').extract_first()
                  item['views'] = sel.xpath('div[@class="post-meta"]/span[1]/text()').extract_first()
                  item['likes'] = sel.xpath('div[@class="post-meta"]/span[2]/text()').extract_first()
                  item['collects'] = sel.xpath('div[@class="post-meta"]/span[3]/text()').extract_first()
                  item['pubDate'] = sel.xpath('div[@class="post-meta"]/span[4]/text()').extract_first()
                  item['pubLocation'] = re.search('^(.*?)\s', sel.xpath('div[@class="post-meta"]/span[5]/text()').extract_first()).group(1)
                  
                  # 清除点赞数为0的社区分享
                  if item['likes'] != '0':
                      yield item
              # 采集50页数据
              total_pages = 50
              for i in range(2, total_pages + 1):
                  url = 'https://developer.alivun.com/bigdata/?page=' + str(i)
                  yield scrapy.Request(url, callback=self.parse)
      
      1. 对于采集的数据,按照要求1的显示顺序进行输出。可以在Spider中实现自定义Pipeline进行数据的过滤和存储。 示例代码:
      import codecs
      import json
      class BigdataPipeline(object):
          def __init__(self):
              self.file = codecs.open('bigdata.json', 'w', encoding='utf-8')
          def process_item(self, item, spider):
              line = json.dumps(dict(item), ensure_ascii=False) + '\n'
              self.file.write(line)
              return item
          def spider_closed(self, spider):
              self.file.close()
          def close_spider(self, spider):
              # 按要求1的格式显示采集的数据
              with codecs.open('bigdata.json', 'r', encoding='utf-8') as f:
                  lines = f.readlines()
                  f.close()
              data = []
              for line in lines:
                  item = json.loads(line.strip())
                  row = [item['title'], item['views'], item['likes'], item['collects'], item['pubDate'], item['pubLocation']]
                  data.append(row)
              # 存储到MySQL数据库中
              import pymysql
              conn = pymysql.connect(host='localhost', user='root', password='123456', db='test', charset='utf8mb4')
              cur = conn.cursor()
              cur.execute('DROP TABLE IF EXISTS bigdata')
              cur.execute('CREATE TABLE bigdata (id INT PRIMARY KEY AUTO_INCREMENT, title VARCHAR(100), views VARCHAR(20), likes VARCHAR(20), collects VARCHAR(20), pubDate DATE, pubLocation VARCHAR(50))')
              for row in data:
                  cur.execute('INSERT INTO bigdata (title, views, likes, collects, pubDate, pubLocation) VALUES (%s, %s, %s, %s, %s, %s)', row)
              conn.commit()
              cur.close()
              conn.close()
      
      1. 最后,可以使用pycharm进行代码编写和调试。在项目目录下使用命令行执行以下命令进行数据采集:
      scrapy crawl bigdata
      

      注意:在执行以上命令之前需要将步骤3中的Spider和Pipeline代码保存到指定文件中,并将步骤1中的Item保存到items.py中。另外,还需要安装pymysql库以便将数据存储到MySQL数据库中。

      展开全部

      评论
      编辑
      预览

      报告相同问题?

    • 相关阅读:
      SDL音视频渲染
      Linux:redis集群(3.*版本 和 5.*版本)搭建方法
      解决方案|智能制造升级,汽车行业借力法大大电子签进入“快车道”
      【无标题】
      线上展厅多元运用
      高通平台Android 蓝牙调试和配置手册-- A2DP Audio Quality Issues
      使用PyQt5界面设计
      JDK中字符的宽度计算流程
      进阶笔录-深入理解Java线程之Synchronized
      SpringCloud Ribbon / Feign
    • 原文地址:https://ask.csdn.net/questions/8110033