鱼C论坛

 找回密码
 立即注册
查看: 2219|回复: 17

[已解决]爬虫存储数据到MySQL

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

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

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

x
请问大佬们,这个代码哪里错了
  1. import requests
  2. import logging
  3. import pymongo
  4. import pymysql

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


  11. #连接MySQL数据库
  12. #初始化
  13. conn = pymysql.Connect(
  14.     host='127.0.0.1',
  15.     port=3306,
  16.     user='root',
  17.     password='123456a'
  18. )
  19. cursor = conn.cursor()






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

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

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



  38. #保存2:MySQL
  39. def save_data(data):
  40.     sql = 'INSERT INTO movies(id,name,score) values (%s,%s,%s)'
  41.     try:
  42.         cursor.execute(sql, (data.get('id'),data.get('name'),data.get('score')))
  43.         conn.commit()
  44.     except:
  45.         conn.rollback()
  46.     conn.close()

  47. def main():
  48.     for page in range(1,3):
  49.         index_data = scrape_index(page)
  50.         for item in index_data.get('results'):
  51.             id = item.get('id')
  52.             detail_data = scrape_detail(id)
  53.             logging.info('detail data {}'.format(detail_data))
  54.             save_data(detail_data)
  55.             logging.info('保存成功')



  56. if __name__ == '__main__':
  57.     main()
复制代码
最佳答案
2023-6-4 15:46:14
您的代码中有一个明显的问题,就是在  save_data  函数中,您关闭了数据库连接。在您的代码中,这个函数会在每次爬取和保存电影详情信息时都被调用,所以在第一次调用后,数据库连接就会被关闭,之后的数据库操作都会失败。

如果您想要在所有的电影详情信息都爬取和保存后再关闭数据库连接,您可以把  conn.close()  这行代码移到  main  函数中,比如在所有循环结束后。

修改后的代码如下:

  1. def save_data(data):
  2.     sql = 'INSERT INTO movies(id,name,score) values (%s,%s,%s)'
  3.     try:
  4.         cursor.execute(sql, (data.get('id'),data.get('name'),data.get('score')))
  5.         conn.commit()
  6.     except:
  7.         conn.rollback()

  8. def main():
  9.     for page in range(1,3):
  10.         index_data = scrape_index(page)
  11.         for item in index_data.get('results'):
  12.             id = item.get('id')
  13.             detail_data = scrape_detail(id)
  14.             logging.info('detail data {}'.format(detail_data))
  15.             save_data(detail_data)
  16.             logging.info('保存成功')
  17.     conn.close()

  18. if __name__ == '__main__':
  19.     main()
复制代码


另外,有两个小问题可能也会引发错误。首先,我注意到您使用了 pymongo 模块,但是在这段代码中并没有实际用到它,因此,如果没有必要,您可以考虑删除这个导入。其次,您没有在连接到MySQL数据库时指定数据库的名称,这可能会导致在插入数据时出错。您可以在  pymysql.Connect  中添加一个  db='database_name'  的参数, database_name  是您要连接的数据库的名称。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-6-4 15:50:42 | 显示全部楼层
isdkz 发表于 2023-6-4 15:46
您的代码中有一个明显的问题,就是在  save_data  函数中,您关闭了数据库连接。在您的代码中,这个函数会 ...

好的,感谢感谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-6-4 15:51:41 | 显示全部楼层
歌者文明清理员 发表于 2023-6-4 15:45
这段代码缺少了连接 MongoDB 数据库的初始化和连接过程,可能会导致在爬取数据时无法将数据存储到 MongoDB  ...

好的,感谢感谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-6-4 15:55:45 | 显示全部楼层

因为想存到mysql,您回答MongoDB,所以就不能给您了,不好意思
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-6-4 15:57:11 | 显示全部楼层
歌者文明清理员 发表于 2023-6-4 15:56
你也不能给我,因为没注意敏感词被审核了

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

使用道具 举报

 楼主| 发表于 2023-6-4 15:59:14 | 显示全部楼层

黑客
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-6-4 15:59:38 | 显示全部楼层

被审核了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-6-4 16:03:06 | 显示全部楼层
isdkz 发表于 2023-6-4 15:46
您的代码中有一个明显的问题,就是在  save_data  函数中,您关闭了数据库连接。在您的代码中,这个函数会 ...

请问这个代码要是想把爬取到的JSON字符串所有的键值都保存到数据库里,只能一个一个创建和插入吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-6-4 16:36:33 | 显示全部楼层
isdkz 发表于 2023-6-4 16:33
如果您想要将爬取到的 JSON 数据的所有键值都保存到数据库中,确实需要确保数据库中的每个字段都有对应的 ...

好的,感谢感谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-10-9 03:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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