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のラベルの中に置かれていることがわかり、この特徴は私たちがこの本文に登る鍵になります.
大まかな考え方が分かったら、次はコードをつけ始めます.
コードは分かりやすいです.穴に入った場所をいくつか話します.
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です.文に他の接続がある場合は、アクセスできません.この問題は最近暇があれば、どう解決すればいいか考えてみましょう.
爬虫類:ネットワーク爬虫類(ウェブクモ、ネットワークロボットとも呼ばれ、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です.文に他の接続がある場合は、アクセスできません.この問題は最近暇があれば、どう解決すればいいか考えてみましょう.