python小小白哟 发表于 2025-4-15 20:08:06

pymysql问题

代码如下:

import requests
from pyquery import PyQuery
import pymysql

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

headers ={
    "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"
}

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

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



sqll = "insert into movies (names,linkss) value (%s,%s)"
cursor.executemany(sqll,[(i.text,),(urls,)])
conn.commit()


我爬取的页面是这个:https://ssr1.scrape.center/, 我想把电影名字和对应的链接保存到数据库中,但是死活不成功,有没有大佬帮忙看下问题出在哪里?谢谢。

FishC 发表于 2025-4-15 20:09:18

问题分析和解决方案

主要存在以下三个问题:

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

修正后的代码:


import requests
from pyquery import PyQuery
import pymysql

conn = pymysql.connect(
    host="127.0.0.1",
    port=3306,
    user="root",
    password="root",
    db="hsc",
    charset='utf8mb4'# 必须添加字符集
)
cursor = conn.cursor()

headers = {
    "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"
}

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

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

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

# 关闭连接
cursor.close()
conn.close()


关键修改说明:


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


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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

player-none 发表于 2025-4-15 21:40:47

电脑不在身边,我发现的错误:
1.应该写成User-Agent(首字母大写),而不是小写
2.urls只是一个字符串而不是包含多个字符串的列表/yuanzu

中吧 发表于 2025-4-16 09:31:48

不明觉厉{:10_257:}

python小小白哟 发表于 2025-4-16 10:30:38

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

有修改建议吗

风雨3137 发表于 2025-4-16 15:32:15

建议直接访问detail链接获取电影名即可
import requests
from pyquery import PyQuery
import pymysql

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

headers ={
    "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"
}

dataList = []

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

sqll = "insert into movies (names,linkss) value (%s,%s)"
cursor.executemany(sqll,dataList)
conn.commit()

风雨3137 发表于 2025-4-16 15:34:11

本帖最后由 风雨3137 于 2025-4-18 08:47 编辑

发重复了……

player-none 发表于 2025-4-16 17:49:18

python小小白哟 发表于 2025-4-16 10:30
有修改建议吗

import requests
from pyquery import PyQuery
import pymysql

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

headers ={
    "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"
}
texts=[]
urls=[]
for i in range(1,11):
    res = requests.get(f"https://ssr1.scrape.center/page/{i}",headers=headers)
    aaa = res.text
    c = PyQuery(aaa)
    aa = c.find("#index .el-row .el-col .el-card .el-card__body .el-row .el-col a .m-b-sm")
    for j in aa:
      texts.append(j.text)
for i in range(1,101):
    urls.append(f"https://ssr1.scrape.center/detail/{i}")
sqll = "insert into movies (names,linkss) value (%s,%s)"
cursor.executemany(sqll,list(zip(texts,urls))
conn.commit()

player-none 发表于 2025-4-16 17:49:40

python小小白哟 发表于 2025-4-16 10:30
有修改建议吗

不知道触发了什么,给你回复了,正在审核

player-none 发表于 2025-4-17 18:10:21

python小小白哟 发表于 2025-4-16 10:30
有修改建议吗

修改建议审核通过了,你看看

python小小白哟 发表于 2025-4-18 19:30:27

player-none 发表于 2025-4-17 18:10
修改建议审核通过了,你看看

你好,运行成功了,但是有一个小疑问,cursor.executemany(sqll,list(zip(names,urls)))   这行代码,为什么用list把zip(names,urls)又转换成列表了呢?

player-none 发表于 2025-4-18 21:43:57

python小小白哟 发表于 2025-4-18 19:30
你好,运行成功了,但是有一个小疑问,cursor.executemany(sqll,list(zip(names,urls)))   这行代码,为 ...

zip功能:

[(0, 1, 2),
(3, 4, 5)]

zip后:

[(0, 3), (1, 4), (2, 5)]

记得list就行

给个最佳呗
页: [1]
查看完整版本: pymysql问题