鱼C论坛

 找回密码
 立即注册
查看: 2243|回复: 10

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

[复制链接]
发表于 2023-7-6 13:13:48 | 显示全部楼层 |阅读模式

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

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

x
请问各位大佬,我的这个代码怎么保存不到数据库
  1. import re
  2. import pymysql
  3. import requests
  4. import logging
  5. from urllib.parse import urljoin
  6. from pyquery import PyQuery as pq

  7. index_url = 'https://www.ygdy8.net/html/gndy/china/list_4_{}.html'
  8. header = {
  9.    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36"
  10. }
  11. PAGE = 3
  12. logging.basicConfig(level=logging.INFO,format='%(asctime)s - %(levelname)s: %(message)s')

  13. #发起请求
  14. def scrape_page(url):
  15.     logging.info('正在爬取:{}...'.format(url))
  16.     try:
  17.         response = requests.get(url=url,headers=header)
  18.         response.encoding = 'gbk'
  19.         if response.status_code == 200:
  20.             return response.text
  21.         logging.error('出现错误,爬取代码:{}'.format(response.status_code))
  22.     except requests.RequestException:
  23.         logging.error('爬取{}出现错误'.format(url))

  24. #拼接url并发起请求
  25. def scrape_index(page):
  26.     url = index_url.format(page)
  27.     return scrape_page(url)


  28. #解析详情页url
  29. def detail_url(index_html):
  30.     details_url = []
  31.     doc = pq(index_html)
  32.     hrefs = doc('td b a:nth-child(2)').items()
  33.     for href in hrefs:
  34.         urls = href.attr('href')
  35.         url = urljoin(index_url, urls)
  36.         details_url.append(url)

  37.     return details_url

  38. #详情页发起请求
  39. def scrpae_detail(url):
  40.     return scrape_page(url)


  41. #解析详情页
  42. def parse_detail(html):

  43.     doc = pq(html)
  44.     brs = doc('#Zoom').text().replace('\n','')
  45.     name_pattern = re.compile('◎译  名(.*?)◎', re.S)
  46.     category_pattern = re.compile('◎类  别(.*?)◎', re.S)
  47.     score_pattern = re.compile('◎豆瓣评分(.*?)/10', re.S)
  48.     actor_pattern = re.compile('◎(?:演  员|主  演)(.*?)◎', re.S)
  49.     dram_pattern = re.compile('◎简  介(.*?)点击下载', re.S)
  50.     name = re.search(name_pattern, brs).group(1).strip()
  51.     category = re.search(category_pattern, brs).group(1).strip()
  52.     score = re.search(score_pattern, brs).group(1).strip() if re.search(score_pattern, brs) else None
  53.     actor = re.search(actor_pattern, brs).group(1).strip()
  54.     dram = re.search(dram_pattern, brs).group(1)
  55.     return {
  56.         '名称':name,
  57.         '类别':category,
  58.         '豆瓣评分':score,
  59.         '演员':actor,
  60.         '简介':dram
  61.     }

  62. def save_data(data):
  63.     db = pymysql.connect(
  64.         host='127.0.0.1',
  65.         user='root',
  66.         password='123456a',
  67.         port=3306,
  68.         db= 'movies'
  69.     )
  70.     #建立游标
  71.     cursor = db.cursor()
  72.     sql = 'INSERT INTO movie (name,category,score,actor,dram) values (%s,%s,%s,%s,%s,)'
  73.     cursor.execute(sql,(data['名称'],data['类别'],data['豆瓣评分'],data['演员'],data['简介']))
  74.     db.commit()
  75.     db.close()




  76. def main():
  77.     for page in range(1,2):
  78.         index_html = scrape_index(page)
  79.         hrefs = detail_url(index_html)
  80.         # logging.info('detail_url:{}'.format(list(href)))
  81.         for href in hrefs:
  82.             detail_html = scrpae_detail(href)
  83.             data = parse_detail(detail_html)
  84.             # print(data['名称'])
  85.             save_data(data)
  86.             # logging.info('{}'.format(dict(data)))
  87.         logging.info('保存成功')


  88. if __name__ == '__main__':
  89.     main()
复制代码


这是错误信息
最佳答案
2023-7-6 13:14:04
根据您提供的代码和错误信息,可能出现了以下问题:

1. 导入模块错误:您在代码开头导入了re、pymysql、requests等模块,但并未安装相应的依赖包。请确保您已经使用pip安装了这些包。例如,可以通过运行以下命令来安装pymysql和requests:
  1. python
  2. pip install pymysql requests
复制代码

2. 数据库连接问题:在save_data函数中,您指定了数据库的主机、用户名、密码等信息。请确保这些信息正确,并且您已经在本地安装了MySQL数据库,并且数据库名为'movies'。如果您的数据库设置有特殊要求,请根据实际情况进行修改。

3. SQL语法错误:在执行SQL插入语句时,在VALUES子句的最后缺少了一个占位符%s。请将以下行:
  1. python
  2. sql = 'INSERT INTO movie (name,category,score,actor,dram) values (%s,%s,%s,%s,%s,)'
复制代码

修改为:
  1. python
  2. sql = 'INSERT INTO movie (name,category,score,actor,dram) values (%s,%s,%s,%s,%s)'
复制代码

4. 数据类型匹配问题:在调用cursor.execute()方法执行SQL插入语句时,将data字典作为参数传递时,你多传入了一个逗号,这可能导致数据类型不匹配。请将以下行:
  1. python
  2. cursor.execute(sql, (data['名称'], data['类别'], data['豆瓣评分'], data['演员'], data['简介']))
复制代码

修改为:
  1. python
  2. cursor.execute(sql, (data['名称'], data['类别'], data['豆瓣评分'], data['演员'], data['简介']))
复制代码

请注意,这只是可能出现的问题之一。如果您仍然遇到错误,请提供完整的错误信息,以便更好地帮助您解决问题。
屏幕截图(58).png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-7-6 13:14:04 | 显示全部楼层    本楼为最佳答案   
根据您提供的代码和错误信息,可能出现了以下问题:

1. 导入模块错误:您在代码开头导入了re、pymysql、requests等模块,但并未安装相应的依赖包。请确保您已经使用pip安装了这些包。例如,可以通过运行以下命令来安装pymysql和requests:
  1. python
  2. pip install pymysql requests
复制代码

2. 数据库连接问题:在save_data函数中,您指定了数据库的主机、用户名、密码等信息。请确保这些信息正确,并且您已经在本地安装了MySQL数据库,并且数据库名为'movies'。如果您的数据库设置有特殊要求,请根据实际情况进行修改。

3. SQL语法错误:在执行SQL插入语句时,在VALUES子句的最后缺少了一个占位符%s。请将以下行:
  1. python
  2. sql = 'INSERT INTO movie (name,category,score,actor,dram) values (%s,%s,%s,%s,%s,)'
复制代码

修改为:
  1. python
  2. sql = 'INSERT INTO movie (name,category,score,actor,dram) values (%s,%s,%s,%s,%s)'
复制代码

4. 数据类型匹配问题:在调用cursor.execute()方法执行SQL插入语句时,将data字典作为参数传递时,你多传入了一个逗号,这可能导致数据类型不匹配。请将以下行:
  1. python
  2. cursor.execute(sql, (data['名称'], data['类别'], data['豆瓣评分'], data['演员'], data['简介']))
复制代码

修改为:
  1. python
  2. cursor.execute(sql, (data['名称'], data['类别'], data['豆瓣评分'], data['演员'], data['简介']))
复制代码

请注意,这只是可能出现的问题之一。如果您仍然遇到错误,请提供完整的错误信息,以便更好地帮助您解决问题。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-6 13:14:04 | 显示全部楼层
根据您提供的代码和错误信息,看起来您的代码在保存数据到数据库时出现了问题。具体来说,您在SQL语句中的VALUES子句中有一个逗号多余的问题。在这里,您不需要在VALUES子句的末尾添加逗号。另外,还有一些其他的问题需要注意。

请将以下代码替换您的save_data函数中的代码:
  1. def save_data(data):
  2.     db = pymysql.connect(
  3.         host='127.0.0.1',
  4.         user='root',
  5.         password='123456a',
  6.         port=3306,
  7.         db='movies'
  8.     )
  9.     #建立游标
  10.     cursor = db.cursor()
  11.     sql = 'INSERT INTO movie (name,category,score,actor,dram) values (%s,%s,%s,%s,%s)'
  12.     cursor.execute(sql,(data['名称'],data['类别'],data['豆瓣评分'],data['演员'],data['简介']))
  13.     db.commit()
  14.     db.close()
复制代码

这样,您的数据应该能够成功保存到数据库中了。

希望能对您有所帮助!如果您还有其他问题,请随时提问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-6 13:15:26 | 显示全部楼层
2楼:58秒
3楼:58秒
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-6 13:20:33 | 显示全部楼层
isdkz 发表于 2023-7-6 13:14
根据您提供的代码和错误信息,看起来您的代码在保存数据到数据库时出现了问题。具体来说,您在SQL语句中的V ...

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

使用道具 举报

 楼主| 发表于 2023-7-6 13:21:08 | 显示全部楼层
陶远航 发表于 2023-7-6 13:14
根据您提供的代码和错误信息,可能出现了以下问题:

1. 导入模块错误:您在代码开头导入了re、pymysql、re ...

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

使用道具 举报

发表于 2023-7-6 13:23:19 From FishC Mobile | 显示全部楼层
sfqxx 发表于 2023-7-6 13:15
2楼:58秒
3楼:58秒

我们只剩两种选择了,一种是不理睬,一种是脚本
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2023-7-6 13:29:20 | 显示全部楼层
歌者文明清理员 发表于 2023-7-6 13:23
我们只剩两种选择了,一种是不理睬,一种是脚本

对于我自己来说,还有一种选择,就是摆烂
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-6 13:29:58 | 显示全部楼层
liuhongrun2022 发表于 2023-7-6 13:29
对于我自己来说,还有一种选择,就是摆烂

现在不理睬就等于摆烂
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-6 13:32:26 | 显示全部楼层
歌者文明清理员 发表于 2023-7-6 13:29
现在不理睬就等于摆烂


我很疑惑,为什么以前你用脚本,现在你为什么抵制脚本又抵制GPT?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-6 13:34:25 | 显示全部楼层
歌者文明清理员 发表于 2023-7-6 13:23
我们只剩两种选择了,一种是不理睬,一种是脚本

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-27 18:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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