Day 4【Datawhale】爬虫入门学习——学习BeautifulSoup

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_27283619/article/details/89110411

1 学习BeautifulSoup基本使用

大家可以参考我之前的一篇文章学习笔记——Beautiful Soup库的安装与基本使用方法官方文档
大家可以从以下角度来考虑对于BeautifulSoup的使用。

  • Step.1 BeautifulSoup是基于标签的,所以我们第一步要准确定位到我们需要信息所在的标签。
  • Step.2 从定位的标签中提取我们需要的信息(一般在属性或者在string中)
  • Step.3 对于提取数据的简单处理

2 项目实战 ——不登录爬取丁香园论坛的回复信息

2.1 目标

爬取丁香园论坛http://www.dxy.cn/bbs/thread/626626#626626上的回复内容。
说明:因为不登录只能爬取到4条。

2.2 思路

  • 第一步准确定位到回复信息所在的标签
    发现我们需要的信息都在<td class="postbody”>中,所以定位到这个标签。
    在这里插入图片描述
ls = soup.find_all("td", class_ = "postbody")
  • 第二步提取信息
    我们需要的信息都在string中,所以直接用get_text()方法就好。其中’\n’的作用是用’\n’分隔不同的标签文本,保证和原网页相同的格式输出(本质就是实现换行);strip=True的作用跟字符串中的strip()方法一样。
ls[i].get_text('\n', strip=True)

2.3 完整代码

说明:因为这部分后续还要完善,所以数据没有过多处理。

#!/usr/bin/env python
#-*- coding:utf-8 -*-
"""
@author: Jock
"""

import requests
from bs4 import  BeautifulSoup as bs
import time

# get_html_text(url)获取网页信息
def get_html_text(url):
    try:
        r = requests.get(url)  # 爬取完整的网页数据
        r.raise_for_status()  # 如果状态不是200,引发HTTPError异常
        return r.text  # 以字符串的形式返回爬取的网页内容
    except:
        print("访问出错")
        return ""  # 发生异常,返回空字符串

# extract_data(data)提取网页内容
def extract_data(data):
    soup = bs(data, 'html.parser')
    # 列表ls_ms回复信息
    ls_ms = []
    ls = soup.find_all("td", class_ = "postbody")
    n = len(ls)
    for i in range(n):
        try:
            ls_ms.append(ls[i].get_text('\n', strip=True))
        except:
            print('出错')
            continue
    return ls_ms

# 主函数
def main():
    url = 'http://www.dxy.cn/bbs/thread/626626#626626'
    data = get_html_text(url)
    ls_ms = extract_data(data)
    n = len(ls_ms)
    print('【问题】:' + ls_ms[0])
    for i in range(1,n):
        print('【回复'+ str(i) + '】是:', end='')
        print(ls_ms[i])

# 测试时间
def count_spend_time(func):
    start_time = time.time()
    func()
    end_time = time.time()
    time_dif = (end_time - start_time)
    second = time_dif%60
    minute = (time_dif//60)%60
    hour = (time_dif//60)//60
    print('spend ' + str(hour) + 'hours,' + str(minute) + 'minutes,' + str(second) + 'seconds')

if __name__ == '__main__':
    count_spend_time(main)

猜你喜欢

转载自blog.csdn.net/qq_27283619/article/details/89110411