鱼C论坛

 找回密码
 立即注册
查看: 117|回复: 11

[已解决]pymysql问题

[复制链接]
发表于 5 天前 | 显示全部楼层 |阅读模式

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

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

x
代码如下:

  1. import requests
  2. from pyquery import PyQuery
  3. import pymysql

  4. conn = pymysql.connect(host="127.0.0.1",port=3306,user="root",password="root",db="hsc")
  5. cursor = conn.cursor()

  6. headers ={
  7.     "user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36 Edg/135.0.0.0"
  8. }

  9. for i in range(1,11):
  10.     res = requests.get(f"https://ssr1.scrape.center/page/{i}",headers=headers)
  11.     aaa = res.text
  12.     c = PyQuery(aaa)
  13.     aa = c.find("#index .el-row .el-col .el-card .el-card__body .el-row .el-col a .m-b-sm")

  14.     # for i in aa:
  15.     #     print(i.text)
  16. for i in range(1,101):
  17.     urls = f"https://ssr1.scrape.center/detail/{i}"



  18. sqll = "insert into movies (names,linkss) value (%s,%s)"
  19. cursor.executemany(sqll,[(i.text,),(urls,)])
  20. conn.commit()
复制代码



我爬取的页面是这个:https://ssr1.scrape.center/, 我想把电影名字和对应的链接保存到数据库中,但是死活不成功,有没有大佬帮忙看下问题出在哪里?谢谢。
最佳答案
前天 21:43
python小小白哟 发表于 2025-4-18 19:30
你好,运行成功了,但是有一个小疑问,cursor.executemany(sqll,list(zip(names,urls)))   这行代码,为 ...

zip功能:

  1. [(0, 1, 2),
  2. (3, 4, 5)]
复制代码


zip后:

  1. [(0, 3), (1, 4), (2, 5)]
复制代码


记得list就行

给个最佳呗
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 5 天前 | 显示全部楼层
问题分析和解决方案

主要存在以下三个问题:

1. 数据未提取:当前代码只获取了电影名称节点,但没有实际提取文本内容和对应链接
2. 参数缺失:executemany()缺少数据参数
3. URL生成逻辑错误:单独生成的100个链接与页面实际数据无关

修正后的代码:


  1. import requests
  2. from pyquery import PyQuery
  3. import pymysql

  4. conn = pymysql.connect(
  5.     host="127.0.0.1",
  6.     port=3306,
  7.     user="root",
  8.     password="root",
  9.     db="hsc",
  10.     charset='utf8mb4'  # 必须添加字符集
  11. )
  12. cursor = conn.cursor()

  13. headers = {
  14.     "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.84 Safari/537.36"
  15. }

  16. # 存储数据的列表
  17. data_list = []

  18. for page in range(1, 11):
  19.     res = requests.get(f"[url=https://ssr1.scrape.center/page/{page}",]https://ssr1.scrape.center/page/{page}",[/url] headers=headers)
  20.     html = PyQuery(res.text)
  21.    
  22.     # 每个页面有10个电影项
  23.     items = html.find("#index > .el-row > .el-col")
  24.     for item in items.items():
  25.         name = item.find(".m-b-sm").text()
  26.         link = item.find("a").attr("href")  # 提取相对链接
  27.         full_link = f"[url=https://ssr1.scrape.center{link}"]https://ssr1.scrape.center{link}"[/url]  # 拼接完整链接
  28.         data_list.append((name, full_link))  # 注意要用元组包裹

  29. # 插入数据(注意字段名检查)
  30. sql = "INSERT INTO movies (names, linkss) VALUES (%s, %s)"
  31. cursor.executemany(sql, data_list)  # 传入数据参数
  32. conn.commit()

  33. # 关闭连接
  34. cursor.close()
  35. conn.close()
复制代码


关键修改说明:

  • 添加字符集参数 charset='utf8mb4' 防止中文乱码
  • 使用 .items() 方法遍历PyQuery对象
  • 通过 .attr("href") 提取链接属性
  • 使用列表 data_list 存储准备插入的数据
  • executemany需要二维元组数据,每个元组对应一条记录


注意检查:
1. 确保数据库表 movies 存在且包含 nameslinkss 字段
2. 字段类型建议:names VARCHAR(255),linkss VARCHAR(500)
3. 如果仍然失败,可在代码中添加 try-except 块捕获具体错误

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 5 天前 | 显示全部楼层
电脑不在身边,我发现的错误:
1.应该写成User-Agent(首字母大写),而不是小写
2.urls只是一个字符串而不是包含多个字符串的列表/yuanzu
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 4 天前 | 显示全部楼层
不明觉厉
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 4 天前 | 显示全部楼层
player-none 发表于 2025-4-15 21:40
电脑不在身边,我发现的错误:
1.应该写成User-Agent(首字母大写),而不是小写
2.urls只是一个字符串而 ...

有修改建议吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 4 天前 | 显示全部楼层
建议直接访问detail链接获取电影名即可
  1. import requests
  2. from pyquery import PyQuery
  3. import pymysql

  4. conn = pymysql.connect(host="127.0.0.1",port=3306,user="root",password="root",db="hsc")
  5. cursor = conn.cursor()

  6. headers ={
  7.     "user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36 Edg/135.0.0.0"
  8. }

  9. dataList = []

  10. for i in range(1,101):
  11.     url = f"https://ssr1.scrape.center/detail/{i}"
  12.     res = requests.get(url,headers=headers)
  13.     html = res.text
  14.     c = PyQuery(html)
  15.     movie_name = c.find("#detail .el-row .el-col .el-card .el-card__body .el-row .p-h a .m-b-sm")[0].text
  16.     dataList.append((movie_name,url))

  17. sqll = "insert into movies (names,linkss) value (%s,%s)"
  18. cursor.executemany(sqll,dataList)
  19. conn.commit()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 4 天前 | 显示全部楼层
本帖最后由 风雨3137 于 2025-4-18 08:47 编辑

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

使用道具 举报

发表于 4 天前 | 显示全部楼层
  1. import requests
  2. from pyquery import PyQuery
  3. import pymysql

  4. conn = pymysql.connect(host="127.0.0.1",port=3306,user="root",password="root",db="hsc")
  5. cursor = conn.cursor()

  6. headers ={
  7.     "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36 Edg/135.0.0.0"
  8. }
  9. texts=[]
  10. urls=[]
  11. for i in range(1,11):
  12.     res = requests.get(f"https://ssr1.scrape.center/page/{i}",headers=headers)
  13.     aaa = res.text
  14.     c = PyQuery(aaa)
  15.     aa = c.find("#index .el-row .el-col .el-card .el-card__body .el-row .el-col a .m-b-sm")
  16.     for j in aa:
  17.         texts.append(j.text)
  18. for i in range(1,101):
  19.     urls.append(f"https://ssr1.scrape.center/detail/{i}")
  20. sqll = "insert into movies (names,linkss) value (%s,%s)"
  21. cursor.executemany(sqll,list(zip(texts,urls))
  22. conn.commit()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 4 天前 | 显示全部楼层

不知道触发了什么,给你回复了,正在审核
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 3 天前 | 显示全部楼层

修改建议审核通过了,你看看
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 前天 19:30 | 显示全部楼层
player-none 发表于 2025-4-17 18:10
修改建议审核通过了,你看看

你好,运行成功了,但是有一个小疑问,cursor.executemany(sqll,list(zip(names,urls)))   这行代码,为什么用list把zip(names,urls)又转换成列表了呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 前天 21:43 | 显示全部楼层    本楼为最佳答案   
python小小白哟 发表于 2025-4-18 19:30
你好,运行成功了,但是有一个小疑问,cursor.executemany(sqll,list(zip(names,urls)))   这行代码,为 ...

zip功能:

  1. [(0, 1, 2),
  2. (3, 4, 5)]
复制代码


zip后:

  1. [(0, 3), (1, 4), (2, 5)]
复制代码


记得list就行

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-20 02:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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