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抓拍博客园文章,并存入数据库的主要内容,如果未能解决你的问题,请参考以下文章

爬虫实战使用python爬取博客园的某一篇文章

Python爬虫爬取博客园并保存

(转)博客园登陆__JSEncrypt 分析

Python+webdriver爬取博客园“我的闪存”并保存到本地

使用python xmlrpc 发送内容到博客园

python简单模拟博客园系统