2017-08-15 73 views
0

私はPythonの新機能です(私はPHP/JavaScriptのバックグラウンドから来ています)が、を持つaタグをすべて見つけるためにウェブサイトとすべての子ページをクロールしたクイックスクリプトを作成したかっただけです。いくつの属性があるかを数えてリンクをクリックします。私はすべてのリンクを数えることができますが、リンクを "クリック"して応答コードを返す方法を理解することはできません。PythonでリンクをクリックするBeautifulSoup

from bs4 import BeautifulSoup 
import urllib2 
import re 

def getLinks(url): 
    html_page = urllib2.urlopen(url) 
    soup = BeautifulSoup(html_page, "html.parser") 
    links = [] 

    for link in soup.findAll('a', attrs={'href': re.compile("^http://")}): 
     links.append(link.get('href')) 
    return links 

anchors = getLinks("http://madisonmemorial.org/") 
# Click on links and return responses 
countMe = len(anchors) 
for anchor in anchors: 
    i = getLinks(anchor) 
    countMe += len(i) 
    # Click on links and return responses 

print countMe 

これはBeautifulSoupでも可能ですか?
また、正確なコードを探しているわけではありません。私が実際に探しているのは、関数呼び出しのための正しい方向の点などです。ありがとう!

+0

あなたはbs4でクリックアクションを実行できないと思うかもしれませんが、おそらくセレンを見てみましょうか?さもなければ新しいリンクで 'urllib2.urlopen'を使うことができますか? – PRMoureu

+2

レスポンスコードを取得するには、単にurllib2.urlopenをURLに入れて使用することができます。 –

答えて

2

BeautifulSoupは単なるDOM/HTMLパーサーであり、実際の、またはあなたのエミュレートされたブラウザを構成しません。その目的のためにChromeやSeleniumを使って実際のブラウザをエミュレートして自由にクロールすることができます。Javascriptが必要ですが、広く利用できるパッケージrequestsを使用すると、すべてのリンクを再帰的にクロールできます:

for link in links: 
    body = requests.get(link).text 
+3

私は姉が言った以上のことに同意します。私はそれを追加したいと思いますあなたが '要求'ライブラリを使って作業しているのを探しているかもしれませんが、上記のlibであらゆる種類のリクエスト(get/post/delなど)を行うことができます。しかし、これはJSのために(少なくとも私に知られている方法で)行うことはできません。しかし、データの登録やログイン、送信をしたいとしましょう。これらのすべては、 'requests'や' urllib'を使うだけで、Seleniumよりはるかに高速です。 –

0

だからコメントから助けを借りて、私はちょうどこのようurlopen使用することを決めた:私は、if文で自分の引数を持っている

from bs4 import BeautifulSoup 
import urllib.request 
import re 

def getLinks(url): 
    html_page = urllib.request.urlopen(url) 
    soup = BeautifulSoup(html_page, "html.parser") 
    links = [] 

    for link in soup.findAll('a', attrs={'href': re.compile("^http://")}): 
     links.append(link.get('href')) 
    return links 

anchors = getLinks("http://madisonmemorial.org/") 
for anchor in anchors: 
    happens = urllib.request.urlopen(anchor) 
    if happens.getcode() == "404": 
     # Do stuff 
# Click on links and return responses 
countMe = len(anchors) 
for anchor in anchors: 
    i = getLinks(anchor) 
    countMe += len(i) 
    happens = urllib.request.urlopen(i) 
    if happens.getcode() == "404": 
     # Do some stuff 

print(countMe) 

+0

私はあなたがこれをやろうとしていると信じています。https://github.com/jmcarp/robobrowser/blob/master/README.rst –

+0

Scrapyはもっと一般的なWebクローラーですが –

関連する問題