Python爬虫项目:爬虫爬取正则分析糗百数据

在上一章学习中,介绍了网络爬虫的作用和在Python中使用自带模块urllib.request的步骤。并且提到了当服务器后台提供动态数据时,可使用charles等软件获取动态数据的接口地址,得到的json数据可用python自带模块内存的数据结构的形式存储。但是爬虫时,很多情况下,数据会直接显示在网页上,需要获取全部网页数据后,在进一步加以分析,提取有用数据,进行存储或者其他操作。在本章学习中,我们通过正则表达式对于网页数据进行分析,提取有效数据。

需求:

爬取https://www.qiushibaike.com/text/page/1/网址的数据,获取每一条数据的发布者和内容,将信息存储到字典中。

涉及到的知识点:
1.爬虫获取网页数据的过程
2.通过正则表达式匹配符合要求的标签
3.将获取到的数据(满足要求的数据)存放到容器当中  (二维列表,字典)

逻辑分析:

本章中需要重点掌握的是理解正则表达式在python当中的使用,具体内容可通过菜鸟教程进行学习。

正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。re 模块使 Python 语言拥有全部的正则表达式功能。compile 函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换。re 模块也提供了与这些方法功能完全一致的函数,这些函数使用一个模式字符串做为它们的第一个参数。

功能实现代码:

import urllib.request
import re
def htmlCrawler(url):
    # 1.模拟请求头
    headers = {
        "Accept": "application/json, text/javascript, */*; q=0.01",
        "X-Requested-With": "XMLHttpRequest",
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36",
        "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"
    }
    #2.获取请求体
    req = urllib.request.Request(url,headers=headers)
    #3.得到响应对象
    response = urllib.request.urlopen(req)
    #4.获取相应数据
    HTML = response.read().decode('utf-8')
    # 正则表达式分析: 找开始和结束标签,两个标签之间把想要的内容需要包含进来,然后依次查找分析。
    pat = r'<div class="author clearfix">(.*?)<span class="stats-vote"><i class="number">'
    # 使用findall方法查找符合要求的全部内容,放置到一个列表
    divlist = re.findall(pat,HTML,re.S)   #re.S  : 是.匹配包括换行之内的所有字符
    #因为要获取每一条数据的发布者和内容,就需要去遍历列表
    #存放的容器
    dic = {}
    for div in divlist:
        #用户名匹配的正则
        name_pat = r'<h2>(.*?)</h2>'
        # 开始查找h2标签,发现每一条只有一个h2标签,
        userlist= re.findall(name_pat,div,re.S)
        username = userlist[0]
        # 段子
        content_pat = r'<div class="content">\n<span>(.*?)</span>'
        contentlist = re.findall(content_pat,div,re.S)
        content = contentlist[0]
        #将名称和段子存储到字典容器当中
        dic[username] = content
    return dic

if __name__ == '__main__':
    url = 'https://www.qiushibaike.com/text/page/1/'
    dic = htmlCrawler(url)
    for k,v in dic.items():
        print(k,":",v)

运行代码,打印在控制台的效果为:

本篇博客代码下载地址:https://download.csdn.net/download/u012156341/11128450

感谢您的阅读!

猜你喜欢

转载自blog.csdn.net/u012156341/article/details/89393836