热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python3爬虫之二网页解析【爬取自己CSDN博客信息】

与Java类比,Java的网页解析有Jsoup工具,Python的网页解析工具对应的是BeautifulSoup。详情可以阅读其官方文档。这里以爬取我的CSDN博客信息

        与Java类比,Java的网页解析有Jsoup工具,Python的网页解析工具对应的是BeautifulSoup。详情可以阅读其官方文档。

        这里以爬取我的CSDN博客信息,包括获取每篇博客的标题、链接、书写日期、访问量、评论数量等信息为例,结合BeautifulSoup,进行网页的解析,详细的说明在代码的注解中讲解。博客首页长这样


       这里讲解一个小技巧,在找爬取目标时,比如这里要获取博客总页数为,在网页(如下)区域,直接“右键 --> 检查”便可直接定位到这个区域对应的源码中的位置,然后通过BeautifulSoup查找对应的元素,即可得到想要的信息。


代码如下:

# coding=utf-8

# 对CSDN博客信息进行爬取,获取博客的主题、链接、日期、访问量、评论数等信息
import re
from urllib import request

from bs4 import BeautifulSoup


class CSDNSpider:

# 初始化爬取的页号、链接以及封装Header
def __init__(self, pageIndex=1, url="http://blog.csdn.net/u012050154/article/list/1"):
self.pageIndex = pageIndex
self.url = url
self.header = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36"
}

# 请求网页得到BeautifulSoup对象
def getBeautifulSoup(self, url):
# 请求网页
req = request.Request(url, headers=self.header)
res = request.urlopen(req)
# 以html5lib格式的解析器解析得到BeautifulSoup对象
# 还有其他的格式如:html.parser/lxml/lxml-xml/xml/html5lib
soup = BeautifulSoup(res, 'html5lib')
return soup

# 获取博客的博文分页总数
def getTotalPages(self):
soup = self.getBeautifulSoup(self.url)
# 得到如下内容“209条 共14页”
pageNumText = soup.find('div', 'pagelist').span.get_text()
# 利用正则表达式进一步提取得到分页数
pageNum =re.findall(re.compile(pattern=r'共(.*?)页'), pageNumText)[0]
return int(pageNum)

# 读取每个页面上各博文的主题、链接、日期、访问量、评论数等信息
def getBlogInfo(self, pageIndx):
res = []
# 每页的链接如http://blog.csdn.net/u012050154/article/list/1
# 所以按pageIndex更新url
url = self.url[0:self.url.rfind('/')+1] + str(pageIndx)
# 按url解析得到BeautifulSoup对象
soup = self.getBeautifulSoup(url)
# 得到目标信息
blog_items = soup.find_all('div', 'list_item article_item')
for item in blog_items:
# 博文主题
title = item.find('span', 'link_title').a.get_text()
blog = '标题:' + title
# 博文链接
link = item.find('span', 'link_title').a.get('href')
blog += '\t博客链接:' + link
# 博文发表日期
postdate = item.find('span', 'link_postdate').get_text()
blog += '\t发表日期:' + postdate
# 博文的访问量
views_text = item.find('span', 'link_view').get_text() # 阅读(38)
views = re.findall(re.compile(r'(\d+)'), views_text)[0]
blog += '\t访问量:' + views
# 博文的评论数
comments_text = item.find('span', 'link_comments').get_text()
comments = re.findall(re.compile(r'(\d+)'), comments_text)[0]
blog += '\t评论数:' + comments + '\n'

print(blog)
res.append(blog)
return res

def saveFile(datas ,pageIndex):
path = "D:\\Program\\PythonCrawler\\CSDN\Data\\page_" + str(pageIndex + 1) + ".txt"
with open(path, 'w', encoding='gbk') as file:
file.write('当前页:' + str(pageIndex + 1) + '\n')
for data in datas:
file.write(data)



if __name__=="__main__":
spider = CSDNSpider()

pageNum = spider.getTotalPages()
print("博客总页数:", pageNum)

for index in range(pageNum):
print("正在处理第%s页…" % (index+1))
blogsInfo = spider.getBlogInfo(index+1)
saveFile(blogsInfo, index)
结果:



参考文献:

1、Beautiful Soup 4.4.0 文档

2、http://blog.csdn.net/fly_yr/article/details/51557656

Git代码


推荐阅读
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 本文介绍了响应式页面的概念和实现方式,包括针对不同终端制作特定页面和制作一个页面适应不同终端的显示。分析了两种实现方式的优缺点,提出了选择方案的建议。同时,对于响应式页面的需求和背景进行了讨论,解释了为什么需要响应式页面。 ... [详细]
  • 文章目录简介HTTP请求过程HTTP状态码含义HTTP头部信息Cookie状态管理HTTP请求方式简介HTTP协议(超文本传输协议)是用于从WWW服务 ... [详细]
  • 这个问题发生在重新安装系统后,丢失了之前的privatekey等。所以解决方法就是提示的revokeandrequest。到developercenter中找到certificat ... [详细]
  • 最近在学Python,看了不少资料、视频,对爬虫比较感兴趣,爬过了网页文字、图片、视频。文字就不说了直接从网页上去根据标签分离出来就好了。图片和视频则需要在获取到相应的链接之后取做下载。以下是图片和视 ... [详细]
  • Scrapy 爬取图片
    1.创建Scrapy项目scrapystartprojectCrawlMeiziTuscrapygenspiderMeiziTuSpiderhttps:movie.douban.c ... [详细]
  • 发现一个好看的手机壁纸网站,撸代码的手已经饥渴难耐了
    本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。最近有同学的爬虫代码出了bug,给问我怎么改于 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 延迟注入工具(python)的SQL脚本
    本文介绍了一个延迟注入工具(python)的SQL脚本,包括使用urllib2、time、socket、threading、requests等模块实现延迟注入的方法。该工具可以通过构造特定的URL来进行注入测试,并通过延迟时间来判断注入是否成功。 ... [详细]
  • 移动端常用单位——rem的使用方法和注意事项
    本文介绍了移动端常用的单位rem的使用方法和注意事项,包括px、%、em、vw、vh等其他常用单位的比较。同时还介绍了如何通过JS获取视口宽度并动态调整rem的值,以适应不同设备的屏幕大小。此外,还提到了rem目前在移动端的主流地位。 ... [详细]
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
  • 本文介绍了使用Python解析C语言结构体的方法,包括定义基本类型和结构体类型的字典,并提供了一个示例代码,展示了如何解析C语言结构体。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 一、Notification通知是属于桌面性质的通知,在显示器的右下角蹦出二、兼容性IE14以及其他桌面浏览器都支持WebNotification,目前 ... [详细]
  • 目录爬虫06scrapy框架1.scrapy概述安装2.基本使用3.全栈数据的爬取4.五大核心组件对象5.适当提升scrapy爬取数据的效率6.请求传参爬虫06scrapy框架1. ... [详细]
author-avatar
Cindere丷lla_茹满
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有