2017-03-28 12 views
2

現在、number_of_pagesという変数をプリセットして、特定のウェブサイトのすべてのページを削っています。この変数のプリセットは、わからない新しいページが追加されるまで機能します。たとえば、以下のコードは3ページ分ですが、Webサイトには現在4ページあります。BeautifulSoupを使用してすべての次のリンクを見つける方法

base_url = 'https://securityadvisories.paloaltonetworks.com/Home/Index/?page=' 
number_of_pages = 3 
for i in range(1, number_of_pages, 1): 
    url_to_scrape = (base_url + str(i)) 

私はBeautifulSoupを使用して、ウェブサイト上の次のすべてのリンクを見つけ出してスクレイプしたいと考えています。次のコードでは、2番目のURLは検索されますが、3番目または4番目のURLは検索されません。それらを掻く前にすべてのページのリストを作成するにはどうすればよいですか?

base_url = 'https://securityadvisories.paloaltonetworks.com/Home/Index/?page=' 
CrawlRequest = requests.get(base_url) 
raw_html = CrawlRequest.text 
linkSoupParser = BeautifulSoup(raw_html, 'html.parser') 
page = linkSoupParser.find('div', {'class': 'pagination'}) 
for list_of_links in page.find('a', href=True, text='next'): 
    nextURL = 'https://securityadvisories.paloaltonetworks.com' + list_of_links.parent['href'] 
print (nextURL) 

答えて

4

ページネーションにはいくつかの方法があります。ここにその一つがあります。

Processing page: #1; url: https://securityadvisories.paloaltonetworks.com/Home/Index/?page= 
Processing page: #2; url: https://securityadvisories.paloaltonetworks.com/Home/Index/?page=2 
Processing page: #3; url: https://securityadvisories.paloaltonetworks.com/Home/Index/?page=3 
Processing page: #4; url: https://securityadvisories.paloaltonetworks.com/Home/Index/?page=4 
Done. 
:あなたはそれを実行した場合、あなたが印刷され、次のメッセージが表示されます

from urllib.parse import urljoin 

from bs4 import BeautifulSoup 
import requests 


with requests.Session() as session: 
    page_number = 1 
    url = 'https://securityadvisories.paloaltonetworks.com/Home/Index/?page=' 
    while True: 
     print("Processing page: #{page_number}; url: {url}".format(page_number=page_number, url=url)) 
     response = session.get(url) 
     soup = BeautifulSoup(response.content, 'html.parser') 

     # check if there is next page, break if not 
     next_link = soup.find("a", text="next") 
     if next_link is None: 
      break 

     url = urljoin(url, next_link["href"]) 
     page_number += 1 

print("Done.") 

アイデアは無限ループを初期化しない「次の」リンクはありません一度それを破るにあります

パフォーマンスを向上させ、リクエスト全体にわたってCookieを維持するため、ウェブスクレイピングセッションはrequests.Sessionで維持しています。

+0

ありがとうございましたAlecxe !!あなたのコードはうまくいった!! –

関連する問題