鱼C论坛

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

[已解决]爬取存到Redis数据库

[复制链接]
发表于 2023-6-4 16:22:54 | 显示全部楼层 |阅读模式

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

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

x
请问大佬们,这个爬取到的想存到Redis中该怎么写呢
import requests
import logging


index_url = 'https://spa1.scrape.center/api/movie/?limit=10&offset={}'
detail_url = 'https://spa1.scrape.center/api/movie/{}/'
header = {
   "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36"
}
logging.basicConfig(level=logging.INFO,format = '%(asctime)s - %(levelname)s: %(message)s')


#发起请求
def scrapy_api(index_url):
    logging.info('正在爬取{}...'.format(index_url))
    try:
        response = requests.get(url=index_url,headers=header,verify=False)
        if response.status_code == 200:
            return response.json()
        logging.error('爬取代码为{},爬取{}失败'.format(response.status_code,index_url))
    except requests.RequestException:
        logging.error('爬取{}失败'.format(index_url),exc_info=True)

#爬取列表页
def scrape_index(page):
    page_url = index_url.format(10*(page-1))
    return scrapy_api(page_url)

#拼接url并发起请求
def scrape_detail(id):
    url = detail_url.format(id)
    return scrapy_api(url)



def main():
    for page in range(1,3):
        index_data = scrape_index(page)
        for item in index_data.get('results'):
            id = item.get('id')
            detail_data = scrape_detail(id)
            logging.info('detail data {}'.format(detail_data))
            
    


if __name__ == '__main__':
    main()
最佳答案
2023-6-4 16:34:41
在您的代码中,您需要导入redis模块,并创建一个redis数据库连接。然后在循环中将爬取到的数据存储到redis数据库中。

首先,您需要安装python的redis库,可以通过以下命令安装:
pip install redis

以下是一个简单的示例代码:
import requests
import logging
import redis

index_url = 'https://spa1.scrape.center/api/movie/?limit=10&offset={}'
detail_url = 'https://spa1.scrape.center/api/movie/{}/'
header = {
   "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36"
}
logging.basicConfig(level=logging.INFO,format = '%(asctime)s - %(levelname)s: %(message)s')

# 创建redis连接
r = redis.Redis(host='localhost', port=6379, db=0)


def scrapy_api(index_url):
    logging.info('正在爬取{}...'.format(index_url))
    try:
        response = requests.get(url=index_url,headers=header,verify=False)
        if response.status_code == 200:
            return response.json()
        logging.error('爬取代码为{},爬取{}失败'.format(response.status_code,index_url))
    except requests.RequestException:
        logging.error('爬取{}失败'.format(index_url),exc_info=True)


def scrape_index(page):
    page_url = index_url.format(10*(page-1))
    return scrapy_api(page_url)


def scrape_detail(id):
    url = detail_url.format(id)
    return scrapy_api(url)


def main():
    for page in range(1,3):
        index_data = scrape_index(page)
        for item in index_data.get('results'):
            id = item.get('id')
            detail_data = scrape_detail(id)
            logging.info('detail data {}'.format(detail_data))

            # 将数据保存到redis
            r.set(f'movie:{id}', str(detail_data))
            

if __name__ == '__main__':
    main()

这里,我们将每一部电影的详细信息存储在redis中,key是 movie:{id} ,value是电影的详细信息。我们使用 str() 将字典转换为字符串,因为redis无法直接存储字典对象。

这是一个非常基础的示例,根据您的实际需要,您可能需要对数据进行进一步的处理,例如序列化和反序列化,以及错误处理等。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-6-4 16:34:41 | 显示全部楼层    本楼为最佳答案   
在您的代码中,您需要导入redis模块,并创建一个redis数据库连接。然后在循环中将爬取到的数据存储到redis数据库中。

首先,您需要安装python的redis库,可以通过以下命令安装:
pip install redis

以下是一个简单的示例代码:
import requests
import logging
import redis

index_url = 'https://spa1.scrape.center/api/movie/?limit=10&offset={}'
detail_url = 'https://spa1.scrape.center/api/movie/{}/'
header = {
   "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36"
}
logging.basicConfig(level=logging.INFO,format = '%(asctime)s - %(levelname)s: %(message)s')

# 创建redis连接
r = redis.Redis(host='localhost', port=6379, db=0)


def scrapy_api(index_url):
    logging.info('正在爬取{}...'.format(index_url))
    try:
        response = requests.get(url=index_url,headers=header,verify=False)
        if response.status_code == 200:
            return response.json()
        logging.error('爬取代码为{},爬取{}失败'.format(response.status_code,index_url))
    except requests.RequestException:
        logging.error('爬取{}失败'.format(index_url),exc_info=True)


def scrape_index(page):
    page_url = index_url.format(10*(page-1))
    return scrapy_api(page_url)


def scrape_detail(id):
    url = detail_url.format(id)
    return scrapy_api(url)


def main():
    for page in range(1,3):
        index_data = scrape_index(page)
        for item in index_data.get('results'):
            id = item.get('id')
            detail_data = scrape_detail(id)
            logging.info('detail data {}'.format(detail_data))

            # 将数据保存到redis
            r.set(f'movie:{id}', str(detail_data))
            

if __name__ == '__main__':
    main()

这里,我们将每一部电影的详细信息存储在redis中,key是 movie:{id} ,value是电影的详细信息。我们使用 str() 将字典转换为字符串,因为redis无法直接存储字典对象。

这是一个非常基础的示例,根据您的实际需要,您可能需要对数据进行进一步的处理,例如序列化和反序列化,以及错误处理等。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-6-4 16:37:28 | 显示全部楼层
isdkz 发表于 2023-6-4 16:34
在您的代码中,您需要导入redis模块,并创建一个redis数据库连接。然后在循环中将爬取到的数据存储到redis ...

好的,感谢感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-22 23:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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