【Python爬虫】正则爬取糗事百科

实验目的:获取糗事百科网页上的段子

思路

1)分析各个页面间的网址规律,构造网址变量

对应的网址:https://www.qiushibaike.com/

接下来,对网址进行分析,此时我只获得了段子的第一个页面,往下拖动,可以看到段子还有很多页,如图所示

糗事百科.png

那么,怎么样才能自动爬取第一页以外的其他页面呢?

单击“2”、“3”...."下一页",观察网址的变化。
鼠标点击“2”之后,发现网址由 https://www.qiushibaike.com/ 变为 https://www.qiushibaike.com/8hr/page/2/
继续点击“3”,发现网址变成了 https://www.qiushibaike.com/8hr/page/3/
觉得还不能得出规律的话可以继续往下点几页观察

可以发现,获取第几页是通过URL地址识别的,即通过GET请求的

通过GET请求获取下一页.png

观察网址的变化,发现有个字段 page,“/”之后的数字对应就是页数,由此推测 page 字段后面的数字代表的是获取第几页的段子内容,将网址中的数字3 改成11 进行验证,即网址变为https://www.qiushibaike.com/8hr/page/11/,观察页面结果,可以看到页面展示的是第11页的段子内容

手工切换网址观察内容变化.png

由此可以想到使用 for 循环实现,每页段子内容读取完后,数字(页数)加1,即自动切换到下一页

2)构建自定义函数,用来实现爬取网页上的段子,包括:用户昵称、段子内容
  • 模拟浏览器访问,观察网页源代码,将用户昵称和段子内容的格式写成正则表达式
  • 用正则表达式提取出用户昵称和段子内容(获取多少内容,即页数由自己决定)
  • 通过 for 循环分别遍历用户昵称和段子内容
3)通过 for 循环获取各页URL链接,每页分别调用一个函数

具体实现代码如下:

# -*- coding: utf-8 -*-
# __author__ = 'Carina'    

import re
import urllib.request


def getcontent(qsbkurl, page):
    # 模拟成浏览器
    headers = ("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:55.0) Gecko/20100101 Firefox/55.0")
    opener = urllib.request.build_opener()
    opener.addheaders = [headers]
    # 将opener 设为全局变量
    urllib.request.install_opener(opener)
    data = urllib.request.urlopen(qsbkurl).read().decode('utf-8')
    # print(data)
    # 构建对应用户提取的正则表达式        
    userpat = '<h2>*(.*?)</h2>'
    # 构建段子内容提取的正则表达式
    contentpat = '<div class="content">(.*?)</div>'
    # 寻找出所有用户
    userlist = re.compile(userpat, re.S).findall(data)    # re.S表示使.匹配包括换行在内的所有字符
    # print(userlist)
    # 寻找出所有的内容
    contestlist = re.compile(contentpat, re.S).findall(data)
    # print(contestlist)
    x = 1
    # 通过for循环遍历段子内容并将内容分别付给对应的变量
    for content in contestlist:
        content = content.replace("\n", "")               # 替换换行符
        content = content.replace("<span>", "")      #可根据需求增减替换字符
        content = content.replace("</span>", "")
        # 用字符串作为变量名,先将对应字符赋给一个变量
        neilong = "content" + str(x)
        # 通过exec()函数实现用字符串作为变量名并赋值
        exec(neilong + '=content')
        x += 1
    y = 1
    # 通过for循环遍历用户,并输出该用户对应的内容
    for user in userlist:
        user = user.replace("\n","")
        neilong = "content" + str(y)
        print("第" + str(page) + "页的用户是:" + user)
        print("段子内容是:")
        exec("print("+ neilong +")")
        print("\n")
        y += 1

# 分别获取各页的段子,通过for循环可以获取多页
for i in range(1, 4):      # 爬取页数自己设定
    qsbkurl = "https://www.qiushibaike.com/8hr/page/" + str(i)
    getcontent(qsbkurl, i)


怎么定位用户昵称和段子内容?

网页鼠标右键---查看源代码,接着可根据页面上的昵称和内容去搜索(Ctrl+F),方便快读定位,由此可得出用户昵称从<h2>...</h2>标签去取,段子内容从<div class="content">.....</div>取,加以整理得出正则表达式

定位元素.png

结合网页和输出结果,看到内容是一致的,数据爬取成功

第一页结果.png
第三页结果.png

总结

通过爬虫进行自动化爬取,可以省下很多时间,比如要通过复制粘贴的方式,几百页的数据耗费的精力就非常大了,另外也有一些网站是不允许复制粘贴的,碰到时会很头疼,只能借助其他办法
采用爬虫的方式,也可以将数据取出来存到数据库方便使用

若糗事百科的网页代码结构发生了变化,那么代码中的URL网址和正则表达式都要进行相应的调整,否则无法爬取。

写给自己的话

学习爬虫,要学会写爬虫的这一套方法并灵活运用
(基本思路一致,具体细节具体分析)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容