python爬虫学习之路(7) 爬取糗事百科

本文介绍了一个简单的糗事百科爬虫实现过程,包括确定URL、分析页面结构、构造正则表达式等步骤,最终实现了自动抓取热门段子的发布者、内容及点赞数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

糗事百科是不需要登录的,所以也没必要用到Cookie,另外,也不需要传数据到后台,所以也不用data.
好,现在我们尝试抓取一下糗事百科的热门段子吧.
我们需要爬取每个段子的发布者,内容和点赞数
1.确定URL并抓取页面代码
首先我们确定好页面的URL是 http://www.qiushibaike.com/hot/page/1
我们先来尝试获取一下糗事百科的网页,看能不能成功获取.

from urllib import request
import re

if __name__ == '__main__':
    # 糗事百科的网址
    url = "https://www.qiushibaike.com/hot/page/1/"
    # headers
    headers={}
    headers["User-Agent"] = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36"
    req = request.Request(url, headers=headers)
    response = request.urlopen(req)
    # 获取html代码
    html = response.read().decode("utf-8")
    print(html)

从获取结果来看,可以看出我们已经成功获取了糗事百科热门页面的html代码了.
这里写图片描述

2, 分析页面html代码
打开网页的调试模式,看看我们所需要的数据是在哪些div里.
这里写图片描述
打开里面的一个div可以分析出每一个段子都是div class=”article block untagged mb15″ id=”…”>…/div>”包裹的内容,接下来再分析我们所要获取的发布人,内容和点赞数在哪个标签里:
这里写图片描述
我们可以看见发布人是在h2标签里的.
这里写图片描述
我们可以看见内容是在span标签里的.
这里写图片描述
我们可以看见点赞数是在i标签里的.

3, 根据我们要获取的信息构造正则表达式
在了解了网页的html标签后,现在来构造一个正则表达式来获取我们所需要的信息
正则表达式如下:

<div.*?author.*?<a.*?<h2>(.*?)</h2>.*?<div.*?<span>(.*?)</span>.*?<div.*?<span.*?<i.*?>(.*?)</i>

现在正则表达式在这里稍作说明

1).? 是一个固定的搭配,.和代表可以匹配任意无限多个字符,加上?表示使用非贪婪模式进行匹配,也就是我们会尽可能短地做匹配,在这里我们用了省略一些不必要的标签,免得正则表达式太长。

2)(.?)代表一个分组,在这个正则表达式中我们匹配了3分组,每一个分组的内容就是我们所需要的信息,在后面的遍历item中,item[0]就代表第一个(.?)所指代的内容,item[1]就代表第二个(.*?)所指代的内容,以此类推。

3)re.S 标志代表在匹配时为点任意匹配模式,点 . 也可以代表换行符。
这样我们就获取了发布人,发布时间,发布内容以及点赞数。

4, 利用正则表达式获取我们所需要的信息

from urllib import request
import re

if __name__ == '__main__':
    # 糗事百科的网址
    url = "https://www.qiushibaike.com/hot/page/1/"
    # headers
    headers={}
    headers["User-Agent"] = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36"
    req = request.Request(url, headers=headers)
    response = request.urlopen(req)
    # 获取html代码
    html = response.read().decode("utf-8")
    构造正则表达式
    zheng = "<div.*?author.*?<a.*?<h2>(.*?)</h2>.*?<div.*?<span>(.*?)</span>.*?<div.*?<span.*?<i.*?>(.*?)</i>"
    pattern = re.compile(zheng, re.S)
    items = re.findall(pattern, html)
    for item in items:
        print(item[0], " ", item[1], " ", item[2])

得到的结果如下:
这里写图片描述
从结果来看,我们已经获取到了我们所需要的信息了.

5 ,完善一下界面和功能

from urllib import request
import re

class QSBK:
    # 初始化变量
    def __init__(self):
        # 糗事百科的网址
        self.url = "https://www.qiushibaike.com/hot/page/{}/"
        # headers
        self.headers = {}
        self.headers["User-Agent"] = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36"
        # 读取第几页内容
        self.pagenum = 1

    # 构造每一次读取页面的url地址
    def set_url(self):
        # 把页面值传到地址里
        url = self.url.format(self.pagenum)
        # 页面值加一
        self.pagenum += 1
        return url

    # 读取网页内容,获取其html代码
    def get_html(self):
        # 设置url
        url = self.set_url()
        req = request.Request(url=url, headers=self.headers)
        # 获取网页内容
        response = request.urlopen(req)
        # 对网页内容进行解码
        html = response.read().decode("utf-8")
        return html

    # 获取网页html并用正则表达式获取我们需要的内容
    def getPage(self):
        html = self.get_html()
        # 构造正则表达式
        zheng = "<div.*?author.*?<a.*?<h2>(.*?)</h2>.*?<div.*?<span>\s*(.*?)\s*</span>.*?<div.*?<span.*?<i.*?>(.*?)</i>"
        pattern = re.compile(zheng, re.S)
        items = re.findall(pattern, html)
        return items

    # 输出我们需要的内容
    def prin(self):
        items = self.getPage()
        for item in items:
            print("发布人:", item[0], "\n内容:\n ", item[1].replace("<br/>", ""), "\n点赞数:\n", item[2])
            print("-"*30)

    # 控制输出
    def con(self):
        while True:
            # 输出内容
            self.prin()
            print("按回车查看新段子,Q退出")
            # 等待用户输入
            userIn = input()
            # 如果输入Q则程序结束
            if input == "Q":
                print("退出糗事百科")
                return


if __name__ == '__main__':
    qs = QSBK()
    qs.con()

效果图如下:
这里写图片描述

仿糗事百科微信小程序 1. 实现顶部页签菜单左右滑动效果 2. 实现顶部页签菜单切换效果,页签菜单选中时字体加粗,同时对应的内容也跟着变化 3. 实现专享界面糗事列表设计,包括发布人头像、发布人昵称、发布的段子等信息,以列表的显示展现出来。 4. 实现视频列表页设计,视频可以进行播放与暂停; 5. 实现分享功能,可以将当前界面分享给好友 6.设计概要:数据绑定、列表渲染、请求服务器数据, (1)实现顶部页签滑动效果,需要借助于scroll-view可滚动视图区域组件,设置scroll-x="true"属性,允许在水平方向上左右滑动 (2)页签菜单切换和内容也跟着进行切换,需要使用swiper滑块视图容器组件,根据current当前页面索引值来决定显示那个面板 (3)设计糗事列表,先设计一条内容,然后可以复制这条内容的布局,在这个基础上进行修改 (4)设计视频列表,需要使用video视频组件,每个视频组件都有唯一的id;设计幻灯片轮播效果,准备好幻灯片需要轮播的图片 (5)分享功能,需要在在 Page 中定义 onShareAppMessage 函数,设置该页面的分享信息 (6)在界面布局的时候,会用到微信小程序的组件,包括view视图容器组件、image图片组件、swiper滑块视图容器组件、scroll-view可滚动视图区域组件、video视频组件等组件的使用 (7) 界面样式设计,需要写一些wxss样式进行界面的美化和渲染 (8)页签菜单切换的时候,需要获得该页签所对应的id,需要绑定菜单切换事件 (9)页面分享,需要使用onShareAppMessage这个API接口,进行界面分享 (10)动态获取糗事列表信息,需要使用wx.request请求获得糗事列表信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值