美文网首页
【Python爬虫】正则爬取糗事百科

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

作者: 倔强的潇洒小姐 | 来源:发表于2017-09-15 00:22 被阅读70次
实验目的:获取糗事百科网页上的段子

思路

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网址和正则表达式都要进行相应的调整,否则无法爬取。

写给自己的话

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

相关文章

网友评论

      本文标题:【Python爬虫】正则爬取糗事百科

      本文链接:https://www.haomeiwen.com/subject/nqejsxtx.html