Python爬虫几个步骤教你写入mysql数据库
(资料图片)
Python爬虫几个步骤教你写入mysql数据库
Python爬虫实现爬取网站中的数据并存入MySQL数据库中,在爬取的时候总要涉及到数据持久化存储,当然有很多中存储的方式,简单点的有excel、txt、json、csv等等。存入mysql我觉的有好多操作空间,如果是开发python后端也可以熟悉一下sql语句,存入数据库的方法也是试了些许网上一些方法,现在把完整功能供大家参考。
直接搜索 phpStudy安装即可,按照下图配置数据库。用户名密码自行设置,然后返回首页启动即可。
pip install pymysql
打开刚安装的phpstudy安装一个mysql客户端连接,数据库是本地的host可以填 127.0.0.1 或 localhost用户名密码是上面设置的
MySQL创建对应的表
CREATE TABLE `text_archives` ( `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'ID', `url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '链接', `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '标题', `image` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '图片', `keywords` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '关键描述', `description` varchar(600) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '内容描述', `content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '内容', `weigh` int(10) NOT NULL DEFAULT 0 COMMENT '权重', `createtime` bigint(16) NOT NULL DEFAULT 0 COMMENT '创建时间', `updatetime` bigint(16) NOT NULL DEFAULT 0 COMMENT '更新时间', `deletetime` bigint(16) NULL DEFAULT NULL COMMENT '删除时间', PRIMARY KEY (`id`) USING BTREE) ENGINE = InnoDB AUTO_INCREMENT = 2692 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '内容表' ROW_FORMAT = Dynamic;SET FOREIGN_KEY_CHECKS = 1;
构造 SQL 语句的字符串 sql ,然后通过 cursor.excute(sql) 执行,下面简单的封装,直接复制即可用。
import pymysqlclass Mysql(object): def __init__(self): self._connect = pymysql.connect( host='127.0.0.1', user='test', password='######', database='test', charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor ) self._cursor = self._connect.cursor() def inset_db(self, table_name, insert_data): try: data = self.get_mysql_data(data=insert_data) fields = data[0] values = data[1] sql = "INSERT INTO {table_name}({fields}) values ({values})".format(table_name=table_name, fields=fields, values=values) self._cursor.execute(sql) self._connect.commit() except Exception as e: self._connect.rollback() # 如果这里是执行的执行存储过程的sql命令,那么可能会存在rollback的情况,所以这里应该考虑到 print("数据插入失败,失败原因:", e) print(insert_data) else: # self.db_close() return self._cursor.lastrowid def update_db(self, table_name, update_data, wheres=None): try: if wheres is not None: sql = "UPDATE {table_name} SET {update_data} WHERE {wheres}".format( table_name=table_name, update_data=update_data, wheres=wheres ) else: sql = "UPDATE {table_name} SET {update_data}".format( table_name=table_name, update_data=update_data) self._cursor.execute(sql) self._connect.commit() except Exception as e: print("更新失败:", e) return False else: # self.db_close() return True def delete_db(self, table_name, wheres): try: # 构建sql语句 sql = "DELETE FROM {table_name} WHERE {wheres}".format(table_name=table_name, wheres=wheres) self._cursor.execute(sql) self._connect.commit() except Exception as e: print('删除失败:', e) return False else: # self.db_close() return True def select_db(self, table_name, fields, wheres=None, get_one=False): try: if wheres is not None: sql = "SELECT {fields} FROM {table_name} WHERE {wheres}".format( fields=fields, table_name=table_name, wheres=wheres ) else: sql = "SELECT {fields} FROM {table_name}".format(fields=fields, table_name=table_name) self._cursor.execute(sql) self._connect.commit() if get_one: result = self._cursor.fetchone() else: result = self._cursor.fetchall() except Exception as e: print("查询失败", e) return None else: # self.db_close() return result def get_mysql_data(self, data): fields = "" insert_data = "" for k, v in data.items(): fields = fields + k + ',' insert_data = insert_data + "'" + str(v) + "'" + ',' fields = fields.strip(',') insert_data = insert_data.strip(',') return [fields, insert_data] def db_close(self): self._cursor.close() self._connect.close()
这次简单点咱们用xpath就行,有一个小技巧咱们在爬取的网页打开开发都模式F12.如下图红框复制第一个或都第二个就行。
下面代码是实现爬取数据然后存入数据库类,大家可参考
from model.nav import Navimport requestsfrom urllib import parsefrom lxml import etreefrom fake_useragent import UserAgentfrom lib.reptile import Reptileimport jsonclass Common(object): def __init__(self, params): self.url = params['url'] self.params = params self.blog = 1 def get_header(self): ua = UserAgent() headers = { 'User-Agent': ua.random } return headers def get_html(self, url): # 在超时间内,对于失败页面尝试请求三次 if self.blog <= 3: try: res = requests.get(url=url, headers=self.get_header(), timeout=3) res.encoding = res.apparent_encoding html = res.text return html except Exception as e: print(e) self.blog += 1 self.get_html(url) def json_insert_data(self, params): category_id = self.insert_category(cname=params['category_name'], pid=params['pid'], icon='') print("分类插入成功:{}".format(params['category_name'])) if category_id: url = params['url'] title = params['title'] image = params['image'] description = params['description'] keywords = params['keywords'] content = params['content'] self.insert_archives(category_id, url, title, image, description, keywords, content) print("内容插入成功:{}".format(title)) print("------------------------------------------------------------") def get_item(self, xpath_html): item_list = xpath_html.xpath(self.params['item_xpath']) print(item_list) for row in item_list: url_list = row.xpath(self.params['url_xpath']) if len(url_list) > 0: self.get_content(url_list[0]) def get_content(self, url): print("正在抓取链接:{}".format(url)) domain = parse.urlparse(url).netloc d_domain = parse.urlparse(self.url).netloc if domain == d_domain: html = self.get_html(url) self.reptile.blog = 1 if html: p = etree.HTML(html) title = self.get_conmon_content(p, self.params['title_xpath']) print("标题为:{}".format(title)) category_name = self.get_conmon_content(p, self.params['category_xpath']) print("分类为:{}".format(category_name)) image = self.get_conmon_content(p, self.params['image_xpath']) print("图片为:{}".format(image)) link = self.get_conmon_content(p, self.params['link_xpaht']) print("链接为:{}".format(link)) description = self.get_conmon_content(p, self.params['description_xpath']) print("描述为:{}".format(description)) keywords = self.get_conmon_content(p, self.params['keywords_xpath']) print("关键描述:{}".format(keywords)) content = self.get_conmon_content(p, self.params['content_xpath']) print("内容为:{}".format(content)) params = { "pid": 158, "title": title, "category_name": category_name, "image": image, 'url': link, 'description': description, 'keywords': keywords, 'content': content, } if title and category_name and link: self.json_insert_data(params)#存入数据库 def get_conmon_content(self, xpath_html, xpath): content_list = xpath_html.xpath(xpath) content = '' if len(content_list) > 0: content = content_list[0].strip() return content def run(self): print("url:{}".format(self.url)) html = self.get_html(self.url) if html: p = etree.HTML(html) self.get_item(p)#爬取的xpathparams = { "url": "https://www.widiz.com/", #爬取url "url_xpath": './/a[1]/@href', "title_xpath": '/html/body/div[1]/div[2]/div[3]/div/div[3]/div/h1/text()', "category_xpath": '/html/body/div[1]/div[2]/div[3]/div/div[3]/div/a[1]/text()', "image_xpath": '/html/body/div[1]/div[2]/div[3]/div/div[2]/div/img/@src', "link_xpaht": '/html/body/div[1]/div[2]/div[3]/div/div[3]/div/div/div[1]/span/a/@href', "description_xpath": '/html/head/meta[10]/@content', "keywords_xpath": '/html/head/meta[5]/@content', "content_xpath": '/html/body/div[1]/div[2]/div[3]/main/div[1]/div/div[1]/div/div[2]/text()'}Common(params).run()
最终效果:
Python爬虫几个步骤教你写入mysql数据库
2023-02-16
刚刚,广元发布最新职务任免通知|焦点
2023-02-16
赛尔号伪装堡垒机械装置_赛尔号伪装堡垒密码-动态焦点
2023-02-16
安全生产教育培训主要内容_安全生产教育培训主要内容有哪些
2023-02-16
南京2023年首批供地挂牌13宗地 总起拍价166.22亿元
2023-02-16
高通骁龙 X75 5G 基带发布,预计 iPhone16 将搭载
2023-02-16
环球快讯:ch3coona是什么电解质
2023-02-16
新华锦2月16日快速上涨|天天热文
2023-02-16
世界热讯:啧啧是什么意思女生_啧啧是什么意思
2023-02-16
梅忠
2023-02-16
刚刚,广元发布最新职务任免通知|焦点
赛尔号伪装堡垒机械装置_赛尔号伪装堡垒密码-动态焦点
安全生产教育培训主要内容_安全生产教育培训主要内容有哪些
南京2023年首批供地挂牌13宗地 总起拍价166.22亿元
高通骁龙 X75 5G 基带发布,预计 iPhone16 将搭载
环球快讯:ch3coona是什么电解质
新华锦2月16日快速上涨|天天热文
世界热讯:啧啧是什么意思女生_啧啧是什么意思
梅忠
2020中秋国庆三倍工资有几天
用友nc财务软件操作手册_用友nc财务软件_世界即时看
日本旅游景点_这10个日本景点,中国人去得最多
今日快讯:脖子上有个“止鼾穴”,睡前一抹持久通气,找回安静好睡眠
立夏当天下雨有什么说法
当前速讯:什么是京畿之地
长沙夫妻投靠落户需要结婚多久 全球今日讯
信用卡一天可以刷几次
钢板有哪些材质_世界时讯
内蒙古车牌号简称_内蒙古车牌_今日讯
新动态:抽动症是什么原因引起的?
今日快看!沙漠种植水稻成功 为保障全球粮食安全再添中国贡献
真空热水锅炉_关于真空热水锅炉的基本详情介绍
如何重新激活硅胶-今日热搜
看热讯:最新清仓甩卖宣传语100句
巴西足球国家队世界杯最新名单(首发阵容及身价)|全球简讯
谁的交集是外心?
幼儿园大班体育课程教案(20篇)最新
世界讯息:公募权重连降两季,新能源车往哪儿开?
9.2分,直接封神!!!
- 盘后1公司发回购公告-更新中
- 最新小学六年级英语毕业试题附答案|短讯
- 云南畹町口岸单月进出口货值超10亿元-世界观热点
- 天天即时看!新冠治疗用药(氢溴酸氘瑞米德韦片)参考采购价795元
- “充29.9元返100元话费”投诉激增,18家经营者被约谈 焦点快报
- 天天快讯:最浪漫的事的优美散文
- 40岁男情人生日送什么礼物好_焦点热讯
- 【全球时快讯】去年12月份1800款万能险产品中 约四成结算利率同比下降
- cut是什么意思中文翻译_cut是什么意思
- 给我你的爱张杰吉他谱_给我你的爱 张杰|当前短讯
- 全球焦点!食用油可以上地铁吗
- 国足亚运队明日出征迪拜拉练 两个位置接受扬科维奇重点考察
- 临床试验中subi指什么 天天简讯
- 三个月婴儿奶量标准表_5个月婴儿奶量|头条
- 温度对聚合氯化铝的影响
- 中小雪场如何做好推广滑雪运动“第一站”?_环球滚动
- 2023成都花开天下国潮音乐嘉年华时间+地点+门票
- 重庆税务APP苹果版怎么下载不了?
- 天天实时:房产早报|新城控股:暂时无法与公司董事、联席总裁曲德君取得联系
- “花式”开学 以心迎新_观热点
- 【天天时快讯】林丹走向新岗位!42岁妻子坐镇现场气场强大,林丹默默站在后面
- 全球热文:非正整数就是除了正整数以外的所有数_非正整数
- 环球实时:女票_关于女票的基本详情介绍
- 吃什么可以美白_吃什么可以美白|今日热搜
- 郑州宇鑫物流官网电话_宇鑫物流官网查询
- 02月11日15时湖南邵阳疫情数据 阳了以后为什么会腰疼?应该怎么办? 通讯
- 当前看点!宅神的礼物txt百度云
- 天天快资讯:我的世界:基岩版1.19.60发布!实现多维度传送,三种触控模式!
- 世界焦点!合肥好玩的地方_合肥好玩的地方有什么
- 微信视频动态15秒素材_微信视频动态15秒素材下载
- 狼尾发型怎么留 狼尾发型怎么剪
- 新款摩托罗拉X30 Pro拥有200MP摄像头和非常顶级硬件的野兽
- 环球动态:用resource_hacker工具去除WinRAR中广告的方法
- 每日热议!23款本田“小雅阁”,百公里4.6个油,安全、舒适一个不落
- 环球视讯!【福建行动】福建6勇士集结!赴叙利亚开展国际救援任务
- 步入软文营销之巅 即时焦点
- 对偶婚_关于对偶婚的基本详情介绍_天天讯息
- 什么是尿血_尿血是怎么回事|全球今热点
- 夹竹桃上榜(非常常见千万别碰) 最毒的植物排名
- 额额头上长痘痘咋消除_额头长痘痘如何消除
- 当前信息:大集团不首先带头去产能 ,今年生猪行业将继续持续亏损状态。
- d3d 11.dll_没有找到d3d11 dll
- 观热点:慧博云通低开7.57%,公司澄清涉ChatGPT业务报道不属实
- 今日看点:电动调节阀型号
- 快资讯丨qq实名认证如何修改
- 环球消息!怎么升级win10版本_怎么升级win10
- 世界滚动:桑乔时隔145天终迎联赛进球
- 红色警戒3起义时刻8项修改器 V1.12 绿色版_红色警戒3起义时刻8项修改器 V1.12 绿色版功能简介 环球动态
- 我国冬小麦春管陆续展开|环球微速讯
- 世界快资讯丨山西强降雪 太原铁路部门多措并举保畅通
