鱼C论坛

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

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

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

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

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

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

index_url = 'https://www.ygdy8.net/html/gndy/china/list_4_{}.html'
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"
}
PAGE = 3
logging.basicConfig(level=logging.INFO,format='%(asctime)s - %(levelname)s: %(message)s')

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

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


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

    return details_url

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


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

    doc = pq(html)
    brs = doc('#Zoom').text().replace('\n','')
    name_pattern = re.compile('◎译  名(.*?)◎', re.S)
    category_pattern = re.compile('◎类  别(.*?)◎', re.S)
    score_pattern = re.compile('◎豆瓣评分(.*?)/10', re.S)
    actor_pattern = re.compile('◎(?:演  员|主  演)(.*?)◎', re.S)
    dram_pattern = re.compile('◎简  介(.*?)点击下载', re.S)
    name = re.search(name_pattern, brs).group(1).strip()
    category = re.search(category_pattern, brs).group(1).strip()
    score = re.search(score_pattern, brs).group(1).strip() if re.search(score_pattern, brs) else None
    actor = re.search(actor_pattern, brs).group(1).strip()
    dram = re.search(dram_pattern, brs).group(1)
    return {
        '名称':name,
        '类别':category,
        '豆瓣评分':score,
        '演员':actor,
        '简介':dram
    }

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




def main():
    for page in range(1,2):
        index_html = scrape_index(page)
        hrefs = detail_url(index_html)
        # logging.info('detail_url:{}'.format(list(href)))
        for href in hrefs:
            detail_html = scrpae_detail(href)
            data = parse_detail(detail_html)
            # print(data['名称'])
            save_data(data)
            # logging.info('{}'.format(dict(data)))
        logging.info('保存成功')


if __name__ == '__main__':
    main()

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

1. 导入模块错误:您在代码开头导入了re、pymysql、requests等模块,但并未安装相应的依赖包。请确保您已经使用pip安装了这些包。例如,可以通过运行以下命令来安装pymysql和requests:
pythonpip install pymysql requests
2. 数据库连接问题:在save_data函数中,您指定了数据库的主机、用户名、密码等信息。请确保这些信息正确,并且您已经在本地安装了MySQL数据库,并且数据库名为'movies'。如果您的数据库设置有特殊要求,请根据实际情况进行修改。

3. SQL语法错误:在执行SQL插入语句时,在VALUES子句的最后缺少了一个占位符%s。请将以下行:
pythonsql = 'INSERT INTO movie (name,category,score,actor,dram) values (%s,%s,%s,%s,%s,)'
修改为:
pythonsql = 'INSERT INTO movie (name,category,score,actor,dram) values (%s,%s,%s,%s,%s)'
4. 数据类型匹配问题:在调用cursor.execute()方法执行SQL插入语句时,将data字典作为参数传递时,你多传入了一个逗号,这可能导致数据类型不匹配。请将以下行:
pythoncursor.execute(sql, (data['名称'], data['类别'], data['豆瓣评分'], data['演员'], data['简介']))
修改为:
pythoncursor.execute(sql, (data['名称'], data['类别'], data['豆瓣评分'], data['演员'], data['简介']))
请注意,这只是可能出现的问题之一。如果您仍然遇到错误,请提供完整的错误信息,以便更好地帮助您解决问题。
屏幕截图(58).png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

1. 导入模块错误:您在代码开头导入了re、pymysql、requests等模块,但并未安装相应的依赖包。请确保您已经使用pip安装了这些包。例如,可以通过运行以下命令来安装pymysql和requests:
pythonpip install pymysql requests
2. 数据库连接问题:在save_data函数中,您指定了数据库的主机、用户名、密码等信息。请确保这些信息正确,并且您已经在本地安装了MySQL数据库,并且数据库名为'movies'。如果您的数据库设置有特殊要求,请根据实际情况进行修改。

3. SQL语法错误:在执行SQL插入语句时,在VALUES子句的最后缺少了一个占位符%s。请将以下行:
pythonsql = 'INSERT INTO movie (name,category,score,actor,dram) values (%s,%s,%s,%s,%s,)'
修改为:
pythonsql = 'INSERT INTO movie (name,category,score,actor,dram) values (%s,%s,%s,%s,%s)'
4. 数据类型匹配问题:在调用cursor.execute()方法执行SQL插入语句时,将data字典作为参数传递时,你多传入了一个逗号,这可能导致数据类型不匹配。请将以下行:
pythoncursor.execute(sql, (data['名称'], data['类别'], data['豆瓣评分'], data['演员'], data['简介']))
修改为:
pythoncursor.execute(sql, (data['名称'], data['类别'], data['豆瓣评分'], data['演员'], data['简介']))
请注意,这只是可能出现的问题之一。如果您仍然遇到错误,请提供完整的错误信息,以便更好地帮助您解决问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

请将以下代码替换您的save_data函数中的代码:
def save_data(data):    db = pymysql.connect(        host='127.0.0.1',        user='root',        password='123456a',        port=3306,        db='movies'    )    #建立游标    cursor = db.cursor()    sql = 'INSERT INTO movie (name,category,score,actor,dram) values (%s,%s,%s,%s,%s)'    cursor.execute(sql,(data['名称'],data['类别'],data['豆瓣评分'],data['演员'],data['简介']))    db.commit()    db.close()
这样,您的数据应该能够成功保存到数据库中了。

希望能对您有所帮助!如果您还有其他问题,请随时提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-6 13:15:26 | 显示全部楼层
2楼:58秒
3楼:58秒
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

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

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

使用道具 举报

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

我们只剩两种选择了,一种是不理睬,一种是脚本
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

对于我自己来说,还有一种选择,就是摆烂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

现在不理睬就等于摆烂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


我很疑惑,为什么以前你用脚本,现在你为什么抵制脚本又抵制GPT?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-22 13:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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