ホームページ  >  記事  >  バックエンド開発  >  Pythonのクローラー技術を使って恥ずかしい事大百科にクローリングする方法を詳しく解説

Pythonのクローラー技術を使って恥ずかしい事大百科にクローリングする方法を詳しく解説

高洛峰
高洛峰オリジナル
2017-03-20 09:25:321188ブラウズ

クローラー技術を学ぶのは初めてです。Zhihu で「恥ずかしいことの百科事典」にアクセスする方法についてのジョークを読んだので、自分でクローラーを作成することにしました。

目標を達成する: 1. 恥ずかしいこと百科事典のジョークまでクロールする

2. 毎回ジョークを登り、Enter キーを押すたびに次のページまでクロールする

技術的実装: python 実装に基づいて、次を使用します。ライブラリ、re ライブラリ、bs4 ライブラリの BeautifulSoup メソッドをリクエストして実現します

主な内容: まず第一に、クロール実装のアイデアを明確にする必要があります。メインの フレームワークを構築しましょう。最初のステップでは、まず Requests ライブラリを使用して Web ページを取得するメソッドを作成します。2 番目のステップでは、bs4 ライブラリの BeautifulSoup メソッドを使用して、取得した Web ページの情報を分析し、正規表現を使用して関連する段落と一致させます。情報。 3 番目のステップは、取得した情報を印刷することです。私たちは皆、メイン 関数 を通じて上記のメソッドを実行します。

まず、関連するライブラリをインポートします

import requests
from bs4 import BeautifulSoup
import bs4
import  re

2番目、最初にWebページの情報を取得します

def getHTMLText(url):
    try:
        user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
        headers = {'User-Agent': user_agent}
        r = requests.get(url,headers = headers)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return ""

3、情報をrに入れて分析します

soup = BeautifulSoup(html,"html.parser")

必要なのは、ジョークのコンテンツと発行者です。 Web ページ ソース コードを表示すると、ジョークの発行者が

'p', attrs={'class': 'content'}中

であることがわかります。ジョークのコンテンツは

'p', attrs={'class': 'author clearfix'}中

にあります。そこで、bs4 ライブラリ メソッドを使用して、これら 2 つのタグ

def fillUnivlist(lis,li,html,count):
    soup = BeautifulSoup(html,"html.parser")
    try:
        a = soup.find_all('p', attrs={'class': 'content'})
        ll = soup.find_all('p', attrs={'class': 'author clearfix'})

と の特定のコンテンツを抽出します。次に、特定の正規表現を使用してそれを取得します。 情報

for sp in a:
    patten = re.compile(r'<span>(.*?)</span>',re.S)
    Info = re.findall(patten,str(sp))
    lis.append(Info)
    count = count + 1
for mc in ll:
    namePatten = re.compile(r'<h2>(.*?)</h2>', re.S)
    d = re.findall(namePatten, str(mc))
    li.append(d)

注意する必要があるのは、find_all メソッドと re findall メソッドがリストを返すことです。正規表現を使用する場合、タグ内の改行は削除されず、大まかに抽出されるだけです。追加する必要があるのは 2 だけです。リストの内容を結合して出力します

def printUnivlist(lis,li,count):
    for i in range(count):
        a = li[i][0]
        b = lis[i][0]
        print ("%s:"%a+"%s"%b)

次に、入力制御関数を作成します。Q を入力してエラーを返し、終了し、Enter を入力して正しい値を返し、次の段落ページをロードします。

def input_enter():
    input1 = input()
    if input1 == 'Q':
        return False
    else:
        return True
main関数で実装します 入力制御の場合、制御関数がエラーを返した場合は出力は行われませんが、制御関数が正しい値を返した場合は出力が継続されます。

for ループ

を通じて次のページを読み込みます。

def main():
    passage = 0
    enable = True
    for i in range(20):
        mc = input_enter()
        if mc==True:
            lit = []
            li = []
            count = 0
            passage = passage + 1
            qbpassage = passage
            print(qbpassage)
            url = 'http://www.qiushibaike.com/8hr/page/' + str(qbpassage) + '/?s=4966318'
            a = getHTMLText(url)
            fillUnivlist(lit, li, a, count)
            number = fillUnivlist(lit, li, a, count)
            printUnivlist(lit, li, number)
        else:
            break
ここでは、ウェブページの段落コンテンツが毎回正しく出力されるように、for ループごとに lis[] と li[] が更新されることに注意する必要がありますソースコードは次のとおりです:

import requests
from bs4 import BeautifulSoup
import bs4
import  re
def getHTMLText(url):
    try:
        user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
        headers = {'User-Agent': user_agent}
        r = requests.get(url,headers = headers)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return ""
def fillUnivlist(lis,li,html,count):
    soup = BeautifulSoup(html,"html.parser")
    try:
        a = soup.find_all('p', attrs={'class': 'content'})
        ll = soup.find_all('p', attrs={'class': 'author clearfix'})
        for sp in a:
            patten = re.compile(r'(.*?)',re.S)
            Info = re.findall(patten,str(sp))
            lis.append(Info)
            count = count + 1
        for mc in ll:
            namePatten = re.compile(r'

(.*?)

', re.S)             d = re.findall(namePatten, str(mc))             li.append(d)     except:         return ""     return count def printUnivlist(lis,li,count):     for i in range(count):         a = li[i][0]         b = lis[i][0]         print ("%s:"%a+"%s"%b) def input_enter():     input1 = input()     if input1 == 'Q':         return False     else:         return True def main():     passage = 0     enable = True     for i in range(20):         mc = input_enter()         if mc==True:             lit = []             li = []             count = 0             passage = passage + 1             qbpassage = passage             print(qbpassage)             url = 'http://www.qiushibaike.com/8hr/page/' + str(qbpassage) + '/?s=4966318'             a = getHTMLText(url)             fillUnivlist(lit, li, a, count)             number = fillUnivlist(lit, li, a, count)             printUnivlist(lit, li, number)         else:             break main()
初めての実行これはまだ最適化できるところがたくさんあるので、皆さんに指摘していただければと思います。

以上がPythonのクローラー技術を使って恥ずかしい事大百科にクローリングする方法を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。