让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言问题分析: 本题要求采集指定网站的数据信息,并对数据进行清洗和存储。其中采集的数据包括社区分享标题、查看数、点赞数、收藏数、发表日期和发表地址。需要注意的是,发表地址只保留具体地区,点赞数为0的社区分享需要清除掉。最后,采集并清洗后的数据需要存储到MySQL数据库中。 解决方案:
- 使用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() # 发表地址
- 在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的显示顺序进行输出。可以在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()
- 最后,可以使用pycharm进行代码编写和调试。在项目目录下使用命令行执行以下命令进行数据采集:
scrapy crawl bigdata
注意:在执行以上命令之前需要将步骤3中的Spider和Pipeline代码保存到指定文件中,并将步骤1中的Item保存到items.py中。另外,还需要安装pymysql库以便将数据存储到MySQL数据库中。