哈岁NB 发表于 2023-7-6 13:13:48

爬取数据保存到数据库

请问各位大佬,我的这个代码怎么保存不到数据库
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:

python
pip install pymysql requests


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

3. SQL语法错误:在执行SQL插入语句时,在VALUES子句的最后缺少了一个占位符%s。请将以下行:

python
sql = 'INSERT INTO movie (name,category,score,actor,dram) values (%s,%s,%s,%s,%s,)'


修改为:

python
sql = 'INSERT INTO movie (name,category,score,actor,dram) values (%s,%s,%s,%s,%s)'


4. 数据类型匹配问题:在调用cursor.execute()方法执行SQL插入语句时,将data字典作为参数传递时,你多传入了一个逗号,这可能导致数据类型不匹配。请将以下行:

python
cursor.execute(sql, (data['名称'], data['类别'], data['豆瓣评分'], data['演员'], data['简介']))


修改为:

python
cursor.execute(sql, (data['名称'], data['类别'], data['豆瓣评分'], data['演员'], data['简介']))


请注意,这只是可能出现的问题之一。如果您仍然遇到错误,请提供完整的错误信息,以便更好地帮助您解决问题。

isdkz 发表于 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()


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

希望能对您有所帮助!如果您还有其他问题,请随时提问。

sfqxx 发表于 2023-7-6 13:15:26

2楼:58秒
3楼:58秒

哈岁NB 发表于 2023-7-6 13:20:33

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

好的,感谢感谢

哈岁NB 发表于 2023-7-6 13:21:08

陶远航 发表于 2023-7-6 13:14
根据您提供的代码和错误信息,可能出现了以下问题:

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

好的,感谢感谢

歌者文明清理员 发表于 2023-7-6 13:23:19

sfqxx 发表于 2023-7-6 13:15
2楼:58秒
3楼:58秒


我们只剩两种选择了,一种是不理睬,一种是脚本

liuhongrun2022 发表于 2023-7-6 13:29:20

歌者文明清理员 发表于 2023-7-6 13:23
我们只剩两种选择了,一种是不理睬,一种是脚本

对于我自己来说,还有一种选择,就是摆烂

歌者文明清理员 发表于 2023-7-6 13:29:58

liuhongrun2022 发表于 2023-7-6 13:29
对于我自己来说,还有一种选择,就是摆烂

现在不理睬就等于摆烂

liuhongrun2022 发表于 2023-7-6 13:32:26

歌者文明清理员 发表于 2023-7-6 13:29
现在不理睬就等于摆烂

我很疑惑,为什么以前你用脚本,现在你为什么抵制脚本又抵制GPT?

sfqxx 发表于 2023-7-6 13:34:25

歌者文明清理员 发表于 2023-7-6 13:23
我们只剩两种选择了,一种是不理睬,一种是脚本

{:10_269:}
页: [1]
查看完整版本: 爬取数据保存到数据库