Python爬虫(二)之使用标准库爬取糗事百科段子

版权声明:本文为博主原创文章,注明出处,随意转载。 https://blog.csdn.net/IMW_MG/article/details/78566238

前言

操作环境:Python3.6PyCharm2017.3

作为爬虫入门练手必爬作业——爬取糗事百科段子,相对来说比较好爬取。之前用BeautifulSoup模块爬取过,这次摆脱第三方库,使用标准库来实现一下。

代码块(一)获取首页段子

根据网页HTML内容可发现一个段子版块的相关标签,我们提取段子作者、段文、以及点赞数即可。
糗事百科

获取首页段子代码

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2017/11/17 17:24 
# @Software: PyCharm

from urllib.request import Request, urlopen
import re

# 首页url
page = 1
url = 'https://www.qiushibaike.com/hot/page/' + str(page) 
# 设置headers信息
headers = {
    'User-Agent': 'User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36'}
# 亲测如果不加入headers信息会导致爬取出错,这也是多数网站基础的反爬机制
request = Request(url, headers=headers)
# 获取html
response = urlopen(request)
html = response.read().decode('utf-8')

# 设置匹配条件
# - 作者位于<h2>标签中,匹配第一个(.*?)
# - 段文位于<span>标签中,匹配第二个(.*?)
# - 点赞数位于<i class="number">标签中,匹配第三个(.*?)
# 获取的三个文本会存入同一元组中
pattern = re.compile(
    r'<div class="article block untagged mb15.*?<h2>(.*?)</h2>.*?<span>(.*?)</span>.*?<span class="stats-vote"><i class="number">(.*?)</i>',
    re.S)
# 匹配网页中的每一个段子中的作者、段文、点赞数
items = re.findall(pattern, html)
# 打印每一个段子信息
for item in items:
    print(item)

代码运行结果

Running E:/Python_Test/Spider_Test/Cuiqingcai/practice_1_qiubai.py
('\n饮酒浪天涯\n', '\n\n\n那时候村里没有理发店,我的头发都是大舅给我剪的……<br/>我舅是名教师,为人热情,所以他班里男孩子的头发也都是他给剪的,可怕的是他只会剪一个发型 锅盖。每当我走在路上遇到不熟悉的人:你是谁谁的学生吧,一看这个锅盖发型就知道了!<br/>终于在我读四年级的时候我们镇上开了个理发店,我再也不找我舅剪头发了。看到我很长时间没找他剪头发了<br/>给我爸打电话:杰的头发肯定长了吧,来我家给他剪剪。<br/>我爸:人家嫌弃你剪的难看,而且就会一个样子,去镇上店里剪了。<br/>我舅:看来我得学个新发型了,不然我这多少年的老顾客都得被抢光了……\n\n', '575')
('\n正在慢慢学会长大\n', '\n\n\n………………割完了……\n\n', '2068')
......
......

代码块(二)整理代码

上面一个代码块中实现了对首页信息的爬取。

根据代码分析和运行结果,至少有三个问题要解决:

  • 只能爬取首页的段子,获取这么少的信息不应该是一个爬虫应该做到的;
  • 运行结果中含有\n<br/>等换行符,实在很影响阅读体验;
  • 不能根据输入情况来设定爬虫程序的爬取范围
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2017/11/17 21:47 
# @File : practice_1_qiubai_1.py 
# @Software: PyCharm

from urllib.request import Request, urlopen
import re
import time


# 获取网页html文本
def getHtml(url):
    headers = {
        'User-Agent': 'User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36'}

    request = Request(url, headers=headers)
    response = urlopen(request)
    html = response.read().decode('utf-8')
    return html

# 获取段子信息
def getText(pageNum=1):
    text_list = []
    for page in range(1, pageNum + 1):
        url = 'https://www.qiushibaike.com/hot/page/' + str(pageNum)
        html = getHtml(url)
        time.sleep(1)       # 加入延时,不加入延时的多页面爬虫都是耍流氓
        pattern = re.compile(
            r'<div class="article block untagged mb15.*?<h2>(.*?)</h2>.*?<span>(.*?)</span>.*?<span class="stats-vote"><i class="number">(.*?)</i>',
            re.S)
        items = re.findall(pattern, html)
        text_list.append(items)     # 将不同页面匹配到的内容,均放入text_list列表中存放起来
    for each_items in text_list:    # 迭代获取每一个网页的每一个段子信息
        for item in each_items:
            count = 0
            for i in item:          # 处理文本,加强阅读效果
                i = i.strip('\n')   # 将'\n'去掉,避免多个换行符叠加
                i = i.replace('<br/>', '\n')    # <br/>是HTML中的用于段落的换行标签,
                                                # 为了保持原本的段落格式,所以需要在我们阅读时替换成文本换行符'\n'
                print(i)
                count += 1
                if count % 3 == 0:
                    print('----' * 20)
    return 0



if __name__ == '__main__':
    try:
        num = int(input('请输入需要爬取的页数:'))
        getText(num)
    except Exception as e:
        print('>====我们遇到了错误====<')

运行结果
加入爬取前10页页面的所有段文,效果如下:

请输入需要爬取的页数:5

饮酒浪天涯
记得那时候我还是骑小电动上班,有一次在红灯口遇到了以前的一个同事,他摇下车窗跟我说:呦,一年不见,咱们的标准都差不多了啊,都是西装皮鞋,唯一的区别就是我坐在车里,你却骑在车上。这特么的就是对我的歧视,我立马就炸了:孙子,你特么牛逼什么,哥的座驾无视红灯,你行吗?说完我一拧电门就出去了……
要不是那天骑三轮的老大爷车开的慢,我特么就不是手臂骨折那么简单了,附图一张,希望大家以后不要装逼
417
--------------------------------------------------------------------------------
16cm的春天
跟闺密去洗澡,我脱了衣服先进去了,快走出更衣室的时候,看见服务大姨对着刚刚脱掉胸罩穿着迷彩服裤子的闺蜜说了一句,“小兔崽子,你怎么进的女浴室?!”。。。。接着
又来了一句,“长头发,应该是女的吧。。。”
从此我和闺蜜再也没去过那家浴池了。。。
1064
--------------------------------------------------------------------------------
巫女~&lt;素素…
晚上跟闺蜜聊天,期间聊的太嗨,涉及到了闺房秘事!
问闺蜜平时跟她老公都是什么姿势,只见闺蜜撇嘴说到“什么姿势啊,你又不是不知道,我们异地,聚少离多的,好不容易见一次,哪顾得上什么姿势,按倒再说啊”……
6767
--------------------------------------------------------------------------------

参考链接:
崔庆才博客:http://cuiqingcai.com/990.html

猜你喜欢

转载自blog.csdn.net/IMW_MG/article/details/78566238