Python抓拍博客园文章,并存入数据库
Posted yangtze-yufei
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python抓拍博客园文章,并存入数据库相关的知识,希望对你有一定的参考价值。
在学习python后,想做个爬虫,抓取博客园文章。
爬虫思路很简单,模拟浏览器访问网页,得到网页的html代码,再根据页面结构,从html中提取自己需要的内容。
本文代码主要分为3个部分:
1、读取博客园首页文章链接。
https://www.cnblogs.com/是博客园的首页,列出了文章,分析页面内容,读取文章的链接。
这需要看页面的结构,可以使用浏览器,再浏览页面代码,选择元素,看界面上选中哪一部分,根据自己的需要,可以看到对应模块的代码。
2、对于每个页面,分析页面内容。
这需要看页面结构。
3、分析完页面内容后,将需要的数据插入到数据库中。
数据设计:
1 -- 博客系统爬虫模块 2 -- 1、创建库 3 drop database if exists blog_service_spider; -- 直接删除数据库,不提醒 4 create database blog_service_spider; -- 创建数据库 5 use blog_service_spider; -- 选择数据库 6 7 -- 8 -- table structure for table `spider_page` 9 -- 10 drop table if exists `spider_page`; 11 12 create table `spider_page` ( 13 `id` varchar(60) not null comment ‘主键‘, 14 `create_time` datetime default current_timestamp comment ‘创建时间‘, 15 `creator` varchar(60) not null comment ‘创建人id‘, 16 `modified_time` datetime default null on update current_timestamp comment ‘修改时间‘, 17 `modifier` varchar(60) default null comment ‘修改人id‘, 18 `title` varchar(100) default null comment ‘文章标题‘, 19 `title_url` varchar(100) default null comment ‘文章地址‘, 20 `content` text default null comment ‘文章内容‘, 21 `post_time` datetime default null comment ‘文章发表时间‘, 22 `author` varchar(100) default null comment ‘作者‘, 23 `author_page` varchar(100) default null comment ‘作者主页‘, 24 primary key (`id`) 25 ) engine=innodb default charset=utf8 comment=‘抓取的文章‘;
python代码如下:
1 ‘‘‘ 2 File Name: webspider 3 Author: tim 4 Date: 2018/7/27 14:36 5 Description: 网页爬虫。抓取博客园首页文章,放入数据库中。 6 放入数据库中的内容:标题、作者、发表时间、文章内容、文章地址、作者主页 7 ‘‘‘ 8 9 from urllib import request 10 import ssl 11 from bs4 import BeautifulSoup 12 import pymysql 13 import uuid 14 15 16 # 传入url,读取url,将返回的页面转换成BeautifulSoup对象 17 def html_parser(url): 18 ssl._create_default_https_context = ssl._create_unverified_context # 加入ssl 19 req = request.Request(url) # 构建请求 20 21 # 代理,模拟浏览器在访问,避免被屏蔽 22 req.add_header(‘User-Agent‘, 23 ‘Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36‘) 24 25 resp = request.urlopen(req) # 发起请求 26 html = resp.read().decode(‘utf-8‘) # 转码 27 28 bf = BeautifulSoup(html, "html.parser") # 将页面转换成BeautifulSoup对象 29 30 return bf 31 32 33 # 分析单个网页 34 def read_page(url): 35 bf = html_parser(url) # 获取BeautifulSoup对象 36 37 # 内容分析 38 post_info = bf.find(‘div‘, class_=‘post‘) # 有用的内容区域,下面的查找从该有用区域中进一步获取 39 40 title = post_info.find(id=‘cb_post_title_url‘).get_text() # 文章标题 41 title_url = post_info.find(id=‘cb_post_title_url‘)[‘href‘] # 文章地址 42 content = post_info.find(id=‘cnblogs_post_body‘) # 文章内容 43 postdate = post_info.find(id=‘post-date‘).get_text() # 文章发表时间 44 author = post_info.find(‘div‘, class_=‘postDesc‘).find(‘a‘).get_text() # 作者 45 author_page = post_info.find(‘div‘, class_=‘postDesc‘).find(‘a‘)[‘href‘] # 作者主页 46 47 ‘‘‘print(title) 48 print(title_url) 49 print(content) 50 print(postdate) 51 print(author) 52 print(author_page)‘‘‘ 53 # 分析完每个页面后,将页面内容插入到数据库中 54 operate_db(title, title_url, content, postdate, author, author_page) 55 56 57 # 分析博客园首页文章列表 58 def read_post_list(): 59 bf = html_parser(‘https://www.cnblogs.com/‘) 60 post_list = bf.find(id=‘post_list‘).find_all(‘div‘, class_="post_item") 61 for post in post_list: 62 page_url = post.find(‘div‘, class_=‘post_item_body‘).h3.a[‘href‘] 63 # 读取每篇文章的url,分别进行页面分析 64 read_page(page_url) 65 66 67 # 操作数据库 68 def operate_db(title, title_url, content, postdate, author, author_page): 69 # 打开数据库连接 70 conn = pymysql.connect(‘localhost‘, ‘root‘, ‘root‘, ‘blog_service_spider‘) 71 72 # 使用cursor()方法获取操作游标 73 cursor = conn.cursor() 74 75 # 执行的sql 76 insert_sql = "insert into spider_page (id,creator,title,title_url,content,post_time,author,author_page) values(%s,%s,%s,%s,%s,%s,%s,%s)" 77 78 # 生成的ID 79 id = str(uuid.uuid1()) 80 81 # 文章内容 82 str_content = str(content) 83 84 # 创建人 85 creator = ‘admin‘ 86 87 try: 88 cursor.execute(insert_sql, 89 (id, creator, title, title_url, str_content, postdate, author, author_page)) # 执行sql语句 90 conn.commit() # 提交到数据库执行 91 except Exception as e: 92 # 如果执行sql语句出现问题,则执行回滚操作 93 conn.rollback() 94 print(e) 95 finally: 96 # 不论try中的代码是否抛出异常,这里都会执行 97 # 关闭游标和数据库连接 98 cursor.close() 99 conn.close() 100 101 102 # start 103 if __name__ == ‘__main__‘: 104 read_post_list()
以上是关于Python抓拍博客园文章,并存入数据库的主要内容,如果未能解决你的问题,请参考以下文章