python爬取豆瓣图书榜单 并存放数据库心得

最近javaweb 项目存放图书的数据库存放的图书太少
决定去豆瓣榜单 爬取一些数据

首先是爬取网页得到数据
以字典类型先储存下来

贴上代码

def init(self, keyword):
self.keyword = keyword
self.url = “https://book.douban.com/tag/” + self.keyword
self.headers = {
“User-Agent”: “Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3741.400 QQBrowser/10.5.3863.400”
}

def get_page(self, start):
params = {
“start”: start * 20,
“type”: “T”
}

response = requests.get(self.url, params=params,
                        headers=self.headers).text
return response

def get_book(self, html):
doc = pq(html)
for items in doc("li.subject-item ").items():
book = items.find(“h2”).text()
message = items.find(“div.pub”).text()
score = items.find(“span.rating_nums”).text()
number = items.find(“span.pl”).text()[1:-1]
yield {
“book”: book,
“message”: message,
“score”: score,
“number”: number
}

返回字典类型

当取出来
dict 中的 message 信息凌乱 但是有规律
通过 / 分割 得到了 list 存放分割好的字符串
遍历 list 可以 通过 下标
因为 message 长度较短 可以直接通过下标 取得
便可以 得到 作者 和 价格

到此为止
我们就拿到了 书名 作者 价格

这里仍然遇到了点小问题
爬出来的价格是 xx元 格式
而数据库存放的是 int类型
所以 在split (’元’) list 取第一项 就可以 得到纯数字格式的字符串 剩下交给cursor 执行即可 mysql会转换为int

接下来的思路是边爬取边存到数据库

python 连接 数据库 较为简单

conn = pymysql.connect(
host =localhost,
port=10047,
user=‘root’,
passwd=‘qaz1234567’,
db=‘Store’,
charset=‘utf8’
)

获取到连接 就可以通过 cursor 游标 操作sql 语句

同时 也遇到了 几个插入 问题

python 同样支持 mysql 预处理 与JDBC 不同的是
占位符 为 %s
另外由于数据库 原因 本身有一个ID 是自增的
在JavaWeb 是通过 Bean 对象操作的
在python 插入ID 的时候 也要占位符 %s 直接去填一个0 就行
MySQL 会自动将ID 递增
另外 cursor 插入数据也需要细节

插入单行数据

def db_insert_data(self, sql, cur, *args):
    try:
        # print(args)
        result = cur.execute(sql, args)
        print('添加语句受影响的行数:  ' + '信息插入数据库成功 ', result)
    except Exception as e:
        print('db_insert_data error: ', e.args)

args 是可变参数

只要将 占位符 的字符 一块放入 即可

解决了这些问题
发现 print 输出了 可以插入
但是MySQL没有效果
一定要记得结尾工作
需要将 cursor 提交事务
cur.close()

conn.commit()

conn.close()

等程序跑完之后 就插入了数据

猜你喜欢

转载自blog.csdn.net/weixin_46999174/article/details/108754269