bugfix> python-3.x > 投稿

私はウェブページからいくつかの情報を抽出しようとして遊んでいて、次のコードがあります:

import re
from math import ceil
from urllib.request import urlopen as uReq, Request
from bs4 import BeautifulSoup as soup
InitUrl="https://mtgsingles.gr/search?q="
NumOfCrawledPages = 0
URL_Next = ""
NumOfPages=5
for i in range(0, NumOfPages):
    if i == 0:
        Url = InitUrl
    else:
        Url = URL_Next
    UClient = uReq(Url)  # downloading the url
    page_html = UClient.read()
    UClient.close()
    page_soup = soup(page_html, "html.parser")

    cards = page_soup.findAll("div", {"class": ["iso-item", "item-row-view"]})

    for card in cards:
        card_name = card.div.div.strong.span.contents[3].contents[0].replace("\xa0 ", "")
        if len(card.div.contents) > 3:
            cardP_T = card.div.contents[3].contents[1].text.replace("\n", "").strip()
        else:
            cardP_T = "Does not exist"
        cardType = card.contents[3].text
        print(card_name + "\n" + cardP_T + "\n" + cardType + "\n")

    try:
        URL_Next = "https://mtgsingles.gr" + page_soup.findAll("li", {"class": "next"})[0].contents[0].get("href")
        print("The next URL is: " + URL_Next + "\n")
    except IndexError:
        print("Crawling process completed! No more infomation to retrieve!")
    else:
        print("The next URL is: " + URL_Next + "\n")
        NumOfCrawledPages += 1
        Url= URL_Next
    finally:
        print("Moving to page : " + str(NumOfCrawledPages + 1) + "\n")

コードは正常に実行され、エラーは発生しませんが、結果は期待どおりではありません。私は次のページのURLと同様にページからいくつかの情報を抽出しようとしています。最終的には、プログラムを5回実行し、5ページをクロールしたいと思います。ただし、このコードは、指定された初期ページ(InitUrl = "xyz.com")を5回すべてクロールし、抽出された次のページURLに進みません。いくつかのprintステートメントを入力してデバッグを試み、問題の場所を確認しましたが、これらのステートメントに問題があると思います。

UClient = uReq(Url) 
 page_html = UClient.read()
 UClient.close()

何らかの理由で、urlopenはforループで繰り返し動作しません。なぜこれが起こるのですか? forステートメントでurlopenを使用するのは間違っていますか?

回答 1 件
  • このサイトは、Ajaxリクエストによってデータを取得します。だから、 post を送信する必要があります  データ取得のリクエスト。

    ヒント:たとえば、次のようにURLを正しく選択します: https://mtgsingles.gr/search?ajax=products-listing&q=

あなたの答え