Requests + Re+Python3 爬取糗事百科

利用Python3爬取糗事百科模板内里面的每一页的文字内容,分以下几个步骤进行。

准备工作

首先需要安装相应包,现在的Python3 下面用到的包基本都是自带的,如果这些包没安装的话,这里给出简易安装步骤。

如果你连Python3都没安装的话,请移驾到这里

按下 Windows +R,输入cmd。首先输入pip 检查是否安装了pip,如未安装,请移驾到这里。

注:pip和pip3都可以。

如果安装了pip ,输入 pip install requests   进行安装。

如何查看是否安装成功,在命令行输入Python ,进入Python工作环境,输入 import requests  如果没报错就说明安装成功。如下图所示


第一步,爬取第一页的内容。

首先,我们来分析一下这个网页的结构

在这幅图中,1是我们传入的url,2是我们要爬取的内容。在这幅图中,我们可以看到,我们只需要改变“https://www.qiushibaike.com/text/page/1/”中数字1就可以爬取所有所有页的内容了。

第二步,查看网页元素

在这里,我们要分析我们要爬取的网页的内容处于什么位置中,然后利用正则表达式来找出我们要爬取的内容,也就是上图中2在这个网页的位置。下面来看一下这个图片。

在这幅图只是一个内容,后面我们要找到这个网页中所有的这样的内容。好,首先,我们来分析一下这幅图,利用正则表达式我们可以图中1的这里开始匹配,使用  .*?   这个非贪婪匹配模式。如果对正则表达式不熟悉的,请移驾到这里。

所以写出来的正则表达式是这样的。

partten = re.compile('<div class="article block untagged mb15.*?".*?>'

                +'.*?<h2>(.*?)</h2>.*?<span>(.*?)</span>.*?</div>',re.S)

这里面就是一个页面中的所有要爬取的内容。

第三步 保存文件

我们可以把我们爬取到的内容以文件的形式进行保存。并保存到相应的路径中。这个路径可以是相对路径或者绝对路径。在Python中路径的'\'要替换成'/'。


第四部,爬取所有页中的内容

在第一幅中,我们可以看到,我们只需要改变“https://www.qiushibaike.com/text/page/1/”中数字1就可以爬取所有所有页的内容了。

好的,接下来就贴出代码,为便于大家看的清楚,我都给出了注释。

源代码:

import requests  
from requests.exceptions import RequestException  
import re
import json

def get_one_page(url):  #获取一页的内容
""" 传入url,这里给出一个try...except...
    是为了异常中断时也能够使程序运行或有所对应的输出
"""
    try:
        response = requests.get(url)  #获取网页请求
        if response.status_code == 200: #通过状态码判断网页的请求状态,200表示请求成功
            html = response.text  #将网页内容返回
            return html
        return None   #请求不成功,返回None
    except RequestException as e:
        return None #有异常也返回None

def parse_one_page(html):  #解析网页内容
    """利用正则表达式来解析返回的网页内容信息
    re.compile()是写一个正则表达式,re.S是它的匹配模式,可以
    将换行符去掉进行匹配
    re.findall(partten,html)是在html中找到所有复合正则表达式
    pattern内容的元组,并返回一个列表
    使用for循环遍历整个列表,并构建一个字典
    """
    partten = re.compile('<div class="article block untagged mb15.*?".*?>'
                +'.*?<h2>(.*?)</h2>.*?<span>(.*?)</span>.*?</div>',re.S)
    items = re.findall(partten,html)
    for item in items:
        yield{
        'author':item[0].strip(), #strip()是去掉空格和换行符
        'text':item[1].strip().replace('<br/>','')#replace(A,B)是将A替换成B
        }
    return items

def write_to_file(content): #将爬取到内容写入文件
"""json.dumps(content,ensure_ascii=False)是将字典形式的内容转化为
一个字符串的格式,ensure_ascii=False 将汉字正常输出"""
    with open('E:/PythonProjects/result1.txt','a',encoding='utf8') as f:
        f.write(json.dumps(content,ensure_ascii=False)+'\n')
        f.close()

def main(page):
    """在main函数中,传一个page参数用来爬取所有页
    写入url,并拼接这个url,page是int型要转化为str型
    然后调用我们之前写的方法即可"""
    url = "https://www.qiushibaike.com/text/page/"+str(page)+"/"
    html =get_one_page(url)
    #print(html)
    items = get_one_page(url)
    for item in items:
        write_to_file(item)    

if __name__ == '__main__':
    """这里是程序入口
    使用for循环依次调用main()函数
    range(1,14)函数表示从1开始
    依次加1,加到13包括13停止
    """
    for page in range(1,14):
        main(page)


因为我也是第一次学习,所以拿出来和大家一起交流,我相信看到这个你也和我一样都是小白,希望共同进步,当然,有大神看到了错误,欢迎指出。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值