2017-08-15 82 views
0

所以我是新來的Python(我來自PHP/JavaScript的背景),但我只是想寫一個快速的腳本爬行網站和所有子頁面找到所有a標籤href屬性,統計有多少,然後點擊鏈接。我可以統計所有的鏈接,但我不知道如何「點擊」鏈接,然後返回響應代碼。點擊鏈接與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

我同意上面的一切,先生說,我也想補充一點,提問者可能正在尋找正在處理'requests'庫,你可以使用所提到的lib做出所有類型的請求(get/post/del等)。但是,這對於JS來說是不可行的(至少以我知道的方式)。但是,假設您想註冊或登錄或提交數據。所有這些只能通過使用'requests'或'urllib'來完成,並且比Selenium快得多。 –

0

所以從意見的幫助下,我決定只使用的urlopen這樣的:

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) 

我有我自己的論點在if語句

+0

我相信你正在試圖做到這一點https://github.com/jmcarp/robobrowser/blob/master/README.rst –

+0

Scrapy是一個更常見的網絡爬蟲,雖然 –