Pythonクローラー戦闘(1):恥ずかしい百科事典のクロール

1.ウェブサイト分析

この記事ではrequests、ライブラリを使用して、恥ずかしさのある100ドットコムを取得します。読者はここをクリックして、スクリプトの恥ずかしいWikipediaページアクセスできますページを以下に示します。

ここに画像の説明を挿入
ページの下部には、デジタルリンクのあるナビゲーションバーがあり、別のページに切り替えることができます。各ページには25、一部が表示されますしたがって、複数ページの爬虫類クロールを実現するにはHTML、コードの現在のページを分析するだけでなく、複数ページのHTMLコードをキャプチャすることもできます。

別のページに切り替えてURL、法律を確認しくださいURL以下に対応する1、2、3ページ

https://www.qiushibaike.com/text/page/1/
https://www.qiushibaike.com/text/page/2/
https://www.qiushibaike.com/text/page/3/

URL法律からわかるように、ページはURL指定た最後の番号で索引付けされています。最初の1ページ番号は112ページ番号は12、法律によりどのページにも簡単にアクセスできますURL主なタスクは次に示すよう、コード開発者ツールの関連部分を追跡してHTML、コードリーダーの各ページを分析することです。F12HTML

ここに画像の説明を挿入
ここに画像の説明を挿入
この記事は正则表达式データ解析の使用方法です。正则表达式読者がブロガーを見ることができるかどうかはわかりません。この記事:Python爬虫類のデータ抽出(III):検証で正規表現Pycharm実行できます正则表达式

ここに画像の説明を挿入
恥ずかしいHTMLコードの百科事典は比較的標準的であり、特定のHTML場所も比較的簡単に見つけることができます。たとえばHTML、コードの配置性別を特定するには、基になるHTMLコードに配置できます。

<div class="articleGender manIcon">34</div>

manIcon特定のユーザーのこの部分を送信することができ、男性は、女性ですwomenIcon

2.サンプルコード

前述の説明と実装によると、13爬虫類の一握りのページの恥ずかしい百科事典の準備のために、名前付きjokes.txtファイルをクロールするために結果を保存します。サンプルコードは次のとおりです。

# -*- coding: UTF-8 -*-
"""
@author:AmoXiang
@file:3.抓取糗事百科网的段子.py
@time:2020/09/11
"""
import requests
import re

headers = {
    
    
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36'
}
joke_list = []  # 用于存储所有的段子


# 判断性别
def verify_sex(class_name):
    if class_name == "womenIcon":
        return '女'
    else:
        return '男'


def get_joke(url):
    res = requests.get(url=url, headers=headers)
    text = res.text  # 获取页面的html代码
    print(text)
    # 获取用户的ID
    # \s: 匹配任何空白字符,包括空格、制表符、换页符等等
    # id_list = re.findall(r'<h2>\s(.*?)\s</h2>', text)  # 第一种正则表达式的写法
    # re.S: 使用(.)字符匹配所有字符,包括换行符  ?: 非贪婪模式
    id_list = re.findall(r'<h2>(.*?)</h2>', text, re.S)  # 第二种正则表达式的写法
    # 获取用户级别
    level_list = re.findall(r'<div class="articleGender .*?">(\d+)</div>', text)
    # 获取性别
    sex_list = re.findall(r'<div class="articleGender (.*?)">\d+</div>', text)
    # 获取段子内容
    content_list = re.findall(r'<div class="content">.*?<span>(.*?)</span>', text, re.S)
    # 获取好笑数
    laugh_list = re.findall(r'<span class="stats-vote"><i class="number">(\d+)</i>', text, re.S)
    # 获取评论数
    comment_list = re.findall(r'<i class="number">(\d+)</i> 评论', text)
    # 使用zip函数将上述获得的数据的对应索引的元素放到一起
    # 例子: [1,2]、[a, b]  ==>[(1,a), (2,b)] 形式
    for id, level, sex, content, laugh, comment in zip(id_list, level_list, sex_list, content_list, laugh_list,
                                                       comment_list):
        id = id.strip()
        sex = verify_sex(sex)
        content = content.strip().replace('<br/>', '')
        # 获取每个段子相关的数据
        info = {
    
    
            'id': id,
            'level': level,
            'sex': sex,
            'content': content,
            'laugh': laugh,
            'comment': comment
        }
        joke_list.append(info)


if __name__ == '__main__':
    # 1.产生 1~13 页的URL
    url_list = ["https://www.qiushibaike.com/text/page/{}/".format(i) for i in range(1, 14)]
    # 2.使用循环 对13个URL进行请求 获取这13页的段子
    for url in url_list:
        get_joke(url)

    # 将抓取结果保存在当前目录的 jokes.txt 文件中
    for joke in joke_list:
        f = open("./jokes.txt", 'a', encoding="utf8")
        try:
            f.write(joke['id'] + "\n")
            f.write(joke['level'] + "\n")
            f.write(joke['sex'] + "\n")
            f.write(joke['content'] + "\n")
            f.write(joke['laugh'] + "\n")
            f.write(joke['comment'] + "\n\n")
        except Exception:
            pass
        finally:
            f.close()

プログラムを実行すると、現在のディレクトリにjokes.txt次のようなドキュメントがもう1つ表示されます。

ここに画像の説明を挿入
上記の内容は、技術的な学習とコミュニケーションのみを目的としています。商業利用のためにデータを収集しないでください。収集すると、結果が自己責任となり、ブロガーとは無関係になります。違反がある場合は、ブロガーに連絡して削除してください。

おすすめ

転載: blog.csdn.net/xw1680/article/details/108535351