「玩转Python爬虫篇」:打造十万博文

news/2024/7/19 11:32:13 标签: 爬虫, markdown, python

「玩转Python爬虫篇」:打造十万博文

前言

这里以爬取博客园文章为例,仅供学习参考,某些AD满天飞的网站太浪费爬虫的感情了。

爬取

  • 使用 BeautifulSoup 获取博文
  • 通过 html2text 将 Html 转 Markdown
  • 保存 Markdown 到本地文件
  • 下载 Markdown 中的图片到本地并替换图片地址
  • 写入数据库

工具

使用到的第三方类库:BeautifulSoup、html2text、PooledDB

代码

获取博文:

# 获取标题和文章内容
def getHtml(blog):
 res = requests.get(blog, headers=headers)
 soup = BeautifulSoup(res.text, 'html.parser')
	# 获取博客标题
 title = soup.find('h1', class_='postTitle').text
	# 去除空格等
 title = title.strip()
	# 获取博客内容
 content = soup.find('div', class_='blogpost-body')
	# 去掉博客外层的DIV
 content = article.decode_contents(formatter="html")
 info = {"title": title, "content": content}
 return info
复制代码

Html 转 Markdown:

# 这里使用开源第三方库 html2text
 md = text_maker.handle(info['content'])
复制代码

保存到本地文件:

def createFile(md, title):
 print('系统默认编码:{}'.format(sys.getdefaultencoding()))
 save_file = str(title) +".md"
 # print(save_file)
 print('准备写入文件:{}'.format(save_file))
 # r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
 # w+ 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
 # a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
 f = codecs.open(save_file, 'w+', 'utf-8')
 f.write(md)
 f.close()
 print('写入文件结束:{}'.format(f.name))
 return save_file
复制代码

下载图片到本地并替换图片地址:

def replace_md_url(md_file):
 """
 把指定MD文件中引用的图片下载到本地,并替换URL
 """
 if os.path.splitext(md_file)[1] != '.md':
 print('{}不是Markdown文件,不做处理。'.format(md_file))
 return
 cnt_replace = 0
 # 日期时间为目录存储图片
 dir_ts = time.strftime('%Y%m', time.localtime())
 isExists = os.path.exists(dir_ts)
 # 判断结果
 if not isExists:
 os.makedirs(dir_ts)
 with open(md_file, 'r', encoding='utf-8') as f: # 使用utf-8 编码打开
 post = f.read()
 matches = re.compile(img_patten).findall(post)
 if matches and len(matches) > 0:
 for match in list(chain(*matches)):
 if match and len(match) > 0:
 array = match.split('/')
 file_name = array[len(array) - 1]
 file_name = dir_ts + "/" + file_name
 img = requests.get(match, headers=headers)
 f = open(file_name, 'ab')
 f.write(img.content)
 new_url = "https://blog.52itstyle.vip/{}".format(file_name)
 # 更新MD中的URL
 post = post.replace(match, new_url)
 cnt_replace = cnt_replace + 1
 # 如果有内容的话,就直接覆盖写入当前的markdown文件
 if post and cnt_replace > 0:
 url = "https://blog.52itstyle.vip"
 open(md_file, 'w', encoding='utf-8').write(post)
 print('{0}的{1}个URL被替换到{2}/{3}'.format(os.path.basename(md_file), cnt_replace, url, dir_ts))
 elif cnt_replace == 0:
 print('{}中没有需要替换的URL'.format(os.path.basename(md_file)))
复制代码

写入数据库:

# 写入数据库
def write_db(title, content, url):
 sql = "INSERT INTO blog (title, content,url) VALUES(%(title)s, %(content)s, %(url)s);"
 param = {"title": title, "content": content, "url": url}
 mysql.insert(sql, param)
复制代码

小结

互联网时代一些开放的博客社区的确方便了很多,但是也伴随着随时消失的可能性,最好就是自己备份一份到本地;你也可以选择自己喜欢的博主,爬取下收藏。更多的Python爬虫教程也会在接下来的教程中为大家讲解,或者伙伴们有什么想看想学的内容也可以留言或者私信我哦!


转载于:https://juejin.im/post/5d4937045188250b0745d94e


http://www.niftyadmin.cn/n/657187.html

相关文章

高位交叉和低位交叉_KDJ指标的高位和低位

KDJ指标的摆荡区间为0~100,所以,我们通常会把其摆荡区间的20以下的区域称为指标的低位,属于机会区域;把80以上的区域称为指标的高位,属于风险区域。凡是在指标的低位区域20以下出现的KDJ向上交叉&#xff0…

screen简单使用

是什么 GNU Screen可以看作是窗口管理器的命令行界面版本。它提供了统一的管理多个会话的界面和相应的功能 有什么用 会话恢复 只要Screen本身没有终止,在其内部运行的会话都可以恢复。这一点对于远程登录的用户特别有用——即使网络连接中断,用户也…

MySQL安装速成指南(ZIP)

MySQL初始化数据库 第一步:将MySQL ZIP压缩包进行解压 第二部:在MySQL主目录创建my.ini文件,并添加以下内容 [client] port3306 socket/tmp/mysql.sock[mysqld] port3307 socket/tmp/mysql.sock key_buffer_size16M max_allowed_packet128M b…

五菱宏光s1图片及价格图片_五菱宏光S1得手不及5万,网友:内饰豪华不愧为秋名山神车超好开...

迎接收看本期的新手懂汽车,在中国汽车环境趋势,销量非常大的每每都是非常轻易被轻忽的微面,而微面平台的老迈非上汽通用五菱莫属。五菱宏光S是五菱在老款五菱宏光车型底子上研发的,微型面包车和MPV的跨界产物,它在发改…

linux shell判断当前环境是32位还是64位

通过uname判断 platformuname -m if [ $platformx86_64 ] thenecho 64 elseecho 32 fi

记录用友T+接口对接的心酸历程

前言:公司的业务主要是对接财务系统做单据传输或者凭证处理的,难免少不了和各大财务软件做数据对接,其中当然是必须通过接口来传递数据了。于是乎,用友T的版本来了,对接的工作自然是我来做,可没想到就是这样…

vue+element-ui 使用富文本编辑器

npm安装编辑器组件npm install vue-quill-editor –save 在components文件夹创建ue.vue组件&#xff0c;如下 ue.vue代码如下&#xff1a; <!-- 组件代码如下 --><template> <div> <script id"editor" type"text/plain"></scri…

rpm介绍以及rpm包的制作

RPM的基础概念 是什么 相当于windows中的安装文件&#xff0c;并且它会自动处理软件包之间的依赖关系 为什么要使用rpm 优点&#xff1a; 包管理系统简单&#xff0c;通过几个命令就可以实现包的安装、升级、卸载。 安装速度比源码包快的多缺点&#xff1a; 经过编译&#…