python3抓取电影天堂存mysql出错如何解决? (已解决)

项目简介:抓取电影天堂的数据,xpath解析,存mysql

 

问题描述:

连续抓取并存储六页数据后,从第七页开始就不能存数据库了,直接回滚数 据库,至今仍未解决,请大佬会的麻烦解答一下      已解决

# python
# -*- coding:utf-8 -*-
# author:Only time:2019/8/15

# 爬取电影天堂 2019必看热片 名字、详情页 xpath解析 存mysql

import requests
import pymysql
from lxml import etree


# 获取所有网址
def get_urlpage():
    base_url = 'https://www.dy2018.com/html/bikan/'
    pagelist = []
    pagelist.append(base_url) # 第一页 比较特殊
    for i in range(2,23):
        url = base_url + 'index_' + str(i) + '.html'
        pagelist.append(url)
    print(pagelist)
    return pagelist


# 解析网页 获取 电影名字、详情页面
def html_parse_save_sql():

    # 连接数据库
    conn = pymysql.connect(
        host='127.0.0.1',
        port=3306,
        user='root',
        password='123qwe',
        database='only',
        charset='utf8'
    )

    # 创建数据库游标
    cursor = conn.cursor()
    # 创建表
    sql_1 = 'create table Dy(id int primary key auto_increment not null ,name varchar(200) not null,info varchar(200))'
    cursor.execute(sql_1)

    try:
        header = {
            'User-Agent':
                'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 QIHU 360SE'
        }
        for page in get_urlpage():
            response = requests.get(page,headers = header)
            response.encoding = 'gbk'  # 解决乱码问题
            print(response.status_code)  # 查询状态码
            responsee = response.text

            html = etree.HTML(responsee)
            name = html.xpath('//table//tr[2]//b/a[2]/text()')      # 注意:坑: tbody千万不能写进xpath 会匹配不出结果
            href_1 = html.xpath('//table//tr[2]/td[2]/b/a[2]/@href')

            info = []  # 存完整的详情页网址
            for i in range(len(href_1)):
                info_1 = 'https://www.dy2018.com' + href_1[i]
                info.append(info_1)


            for i in range(len(info)):
                sql_2 = 'insert into Dy(name,info) values ("%s","%s")'
                cursor.execute(
                    sql_2 % (name[i],info[i])
                )
                print(info[i])

            # 从游标中获取结果
            cursor.fetchall()
            # 提交结果
            conn.commit()
            print("结果已提交")

    except Exception as e:
        # 数据回滚
        conn.rollback()
        print("数据已回滚")
    # 关闭数据库
    conn.close()


if __name__ == '__main__':
    html_parse_save_sql()

 

 

更新:

注意!!!

坑1:xpath解析时要避免出现tbody,否则会出现错误,匹配不了数据。

坑2:很奇怪,爬取电影天堂时从第七页开始,名字与链接的数量就不同了,到现在我不知道是什么原因!一开始我是以链接的长度为range的,但是出现错误,因为链接的长度有时会大于名字的长度,要以长度短的为range,即在代码中纠正。

坑3:一定要结合异常处理分析错误。

 

一、代码展示:

# python
# -*- coding:utf-8 -*-
# author:Only time:2019/8/15

# 爬取电影天堂 2019必看热片 名字、详情页 xpath解析 存mysql

import requests
import pymysql
from lxml import etree

# https://www.dy2018.com/html/bikan/index_7.html
# 获取所有网址
def get_urlpage():
    base_url = 'https://www.dy2018.com/html/bikan/'
    pagelist = []
    pagelist.append(base_url) # 第一页 比较特殊
    for i in range(2,23):
        url = base_url + 'index_' + str(i) + '.html'
        pagelist.append(url)

    return pagelist


# 解析网页 获取 电影名字、详情页面
def html_parse_save_sql():

    # 连接数据库
    conn = pymysql.connect(
        host='127.0.0.1',
        port=3306,
        user='root',
        password='123qwe',
        database='only',
        charset='utf8'
    )

    # 创建数据库游标
    cursor = conn.cursor()
    # 创建表
    sql_1 = 'create table Dy(id int primary key auto_increment not null ,name varchar(200) not null,info varchar(200))'
    cursor.execute(sql_1)

    try:
        header = {
            'User-Agent':
                'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 QIHU 360SE'
        }
        for page in get_urlpage():
            response = requests.get(page,headers = header)
            response.encoding = 'gbk'  # 解决乱码问题
            print(response.status_code)  # 查询状态码
            responsee = response.text

            html = etree.HTML(responsee)
            name = html.xpath('//table//tr[2]//b/a[2]/text()')      # 注意:坑1: tbody千万不能写进xpath 会匹配不出结果
            href_1 = html.xpath('//table//tr[2]/td[2]/b/a[2]/@href')

            info = []  # 存完整的详情页网址
            for i in range(len(href_1)):
                info_1 = 'https://www.dy2018.com' + href_1[i]
                info.append(info_1)
            # 测试匹配到的数据为多少
            print(len(name))
            print(len(info))

            for i in range(len(name)):   # 注意:坑2:第七页开始匹配的名字与链接数目不同,到现在我也不知道为什么!!
                sql_2 = 'insert into Dy(name,info) values ("%s","%s")'
                cursor.execute(
                    sql_2 % (name[i],info[i])
                )
            print("插入成功")

            # 从游标中获取结果
            cursor.fetchall()
            # 提交结果
            conn.commit()
            print("结果已提交")

    except Exception as e:
        # 数据回滚
        conn.rollback()
        print("数据已回滚")
        print(e)
    # 关闭数据库
    conn.close()


if __name__ == '__main__':
    html_parse_save_sql()

二、运行结果:

三、查看数据库:

四、解决!

 

五、总结:

(1) 一定要结合异常处理分析出错,便于你快速知道错误原因。

(2) xpath解析一定不能加入tbody,否则匹配不了

(3)注意range()、len()的使用

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 13
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值