BeautifulSoup+Request爬虫類実践記録

3756 ワード

アルゴリズムの実現はひとまず一段落し,最近は少し忙しい.最近やっているもの--データマイニングのデータから取得した爬虫類を紹介します.
爬虫類:ネットワーク爬虫類(ウェブクモ、ネットワークロボットとも呼ばれ、FOAFコミュニティの間では、よりよくウェブ追跡者と呼ばれる)は、一定のルールに従って、自動的に万次元ネットワーク情報をキャプチャするプログラムまたはスクリプトである.アリ、自動インデックス、シミュレータ、ワームなど、あまり使われていない名前もあります.その主な目的は一定のデータを這い出すことである.
今回の爬虫類は、アメリカの一般教書を這うことを目的としています.このサイトhttp://www.presidency.ucsb.edu/sou.php一般教書がいくつかあります.そこで、このサイトから1920年から1949年までの一般教書を取り出します.
ホームページの一般教書のホームページを開けて、Googleブラウザでコードをチェックして、発見することができます:2013年の一般教書の接続は:http://www.presidency.ucsb.edu/ws/index.php?pid=102826 その後,他の教書の接続を開くと,hrefにpidが現れることが分かったので,これを用いて正則マッチング爬取接続を行った.
接続に登った後、次に登った接続にアクセスします.私たちは前のステップで、登った年と接続を辞書に保存し、辞書を巡り、毎年の接続にアクセスすることができます.
私たちはまず13年間の接続を開き、彼の要素を確認します.
各接続の本文はspanのラベルの中に置かれていることがわかり、この特徴は私たちがこの本文に登る鍵になります.
大まかな考え方が分かったら、次はコードをつけ始めます.
import re
from bs4 import BeautifulSoup
import  requests
import openpyxl
import datetime
class pachong:
    def set_path(self,path):
        self.path = path
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.63 Safari/537.36'}
    def get_url(self,url):
        html = requests.get(url, self.headers).content
        bsobj = BeautifulSoup(html, "html.parser", from_encoding="utf-8")
        return bsobj

    def get_links(self,value):
        links = value.find_all("a", href=re.compile("pid"), text=re.compile('19[2-4]'))
        url = {}
        for i in range(len(links)):
            url[str(links[i].contents[0])] = str(links[i].attrs['href'])
        return url

    def get_text(self,url):
        bsobj=self.get_url(url)
        cont = bsobj.find_all('span', class_=re.compile("displaytext"))
        for con in cont:
            text = con.find_all('p')  #         p  
        file = ""
        for i in range(len(text)):
            file += str(text[i].contents[0])
        return file

    def save_xls(self,i,f,year,file ):
        sheet1=f.active
        sheet1["A%d" % (i)].value =year
        sheet1["B%d" % (i)].value = file


if __name__ == '__main__':
    starttime = datetime.datetime.now()
    p = pachong()
    print("       :")
    path=input()
    p.set_path(path)
    print("      。。。。")
    link_list=p.get_links(p.get_url("http://www.presidency.ucsb.edu/sou.php"))
    i = 1
    f = openpyxl.Workbook()  #      
    for key in link_list:
        year=key
        print(key,link_list[key])
        file=p.get_text(link_list[key])
        p.save_xls(i,f,year,file)
        i+=1
    f.save(p.path)
    endtime = datetime.datetime.now()
    print("      "+str(endtime - starttime))


コードは分かりやすいです.穴に入った場所をいくつか話します.
1、find_all()関数は、配列と同様にResultSet、すなわち集合を返し、インデックスによって各要素の値をfind()関数とは異なる値で表示できます.だから、戻ってくるデータが多くて、役に立たないラベルも入ってきました.
    findを使ったらall()関数、おめでとうございます.当選しました.find_allが返すオブジェクトは一定の処理を行う.
    1)find_allにはattrsとcontentsの2つの一般的なパラメータがあります.
                attrsで、このラベルの中の属性を返します.attrs['href']を使用すると、オブジェクトに戻るhrefの接続が得られます.
                contentsは、ラベル内のすべてのコンテンツを取得します.例えばfind_を使ってall('p')はpタグを検索し、見つかったpタグのすべての内容を返します.そのため、contentsを正確に動かすには、良い正則表現が必要です.
    2)上記の問題に続いて、重要な情報を正確にマッチングできず、無駄なラベルがたくさん含まれている場合や、この例のようにテキストを複数のpラベルで分割しています.では、さらに処理する必要があります.では、どうすればいいのでしょうか.最初のfindの結果をfindしています.原理は同じで、この時に処理するのはとても便利です.
    3)excelに格納すると,提示文字が制限を超えているという問題が発生する可能性がある.それは、あなたのかばんが間違っていることを意味します.Openpyxlに変更することをお勧めします.このかばんはこの問題を解決します.
    開拓:この爬虫類の基礎があって、私は更に他のホームページに登るのが比較的に簡単だと思って、すべて1つの構想で、正確にホームページの特徴を分析して、対応する正則の表現式を書くだけでいいです.もちろん、この爬虫類にも大きな欠点がありますが、登りの深さは1です.文に他の接続がある場合は、アクセスできません.この問題は最近暇があれば、どう解決すればいいか考えてみましょう.