2017-10-22 19 views
0

さまざまなページからいくつかのデータをスクラップする際に問題があります。私はGoogleにいくつかのソリューションを試しましたが、まったく動作しませんでした。ウェブスクレイピング次のページ

私のポイントは、このウェブサイトからのグラフィックスカードの名前だけウェブスクラップです:最初の場所では「https://www.newegg.com/Product/ProductList.aspx?Submit=StoreIM&IsNodeId=1&bop=And&Depa=1&Category=38&Page=2&PageSize=12&order=BESTMATCH

、私はちょうどページのいずれかで動作するコードをビルドしてみました。そしてそれはかなりうまくいく。これにより

from urllib2 import urlopen as uReq 
    from bs4 import BeautifulSoup as soup 
    import requests 
    import re 

    my_url = "https://www.newegg.com/Product/ProductList.aspx?Submit=StoreIM&IsNodeId=1&bop=And&Depa=1&Category=38&Page=2&PageSize=12&order=BESTMATCH" 
    uClient = uReq(my_url) 
    page_html = uClient.read() 
    uClient.close() 
    page_soup = soup(page_html, "html.parser") 

    containers = page_soup.findAll("div",{"class":"item-container"}) 
    container = containers[0] 

    for container in containers: 
     title_container = container.findAll("a",{"class":"item-title"}) 
     product_name = title_container[0].text 
     print("product_name: " + product_name) 

、私はHTMLで1に切り替えた場合、私はとして最初のものの名前を取得することができます2ページでグラフィックカードの名前を得ましたよく

私はそれを処理するためにループを作りましたが、最初のページを何度も何度も何度も返すようです。

i = 1 
    my_url = "https://www.newegg.com/Product/ProductList.aspx?Submit=StoreIM&IsNodeId=1&bop=And&Depa=1&Category=38&Page={}&PageSize=12&order=BESTMATCH".format(i) 
    while i <= 3: 
     uClient = uReq(my_url) 
     page_html = uClient.read() 
     uClient.close() 
     page_soup = soup(page_html, "html.parser") 

     # esse é o que vou usar para fazer o loop 

     containers = page_soup.findAll("div",{"class":"item-container"}) 

     container = containers[0] 


     for container in containers: 
      title_container = container.findAll("a",{"class":"item-title"}) 
      product_name = title_container[0].text 

      print("product_name: " + product_name) 

     i = i+1 

誰もがそれで私を助けることができていますか? = D

PS:コードを変更して、より良いソリューションを提案してください。 PS 2:Jupyter LabのPython 3.5。

答えて

0

スクレーパーで提供するリンクが完全にロールするようにループを作成する必要があります。いくつかの方法で同じことができます。ここにその一つがあります。スクリプトを実行するだけで、すべての製品名が3ページを横断します。

import requests 
from bs4 import BeautifulSoup 

for page in range(1,4): 
    my_url = "https://www.newegg.com/Product/ProductList.aspx?Submit=StoreIM&IsNodeId=1&page={}&bop=And&Depa=1&Category=38&PageSize=12&order=BESTMATCH".format(page) 
    res = requests.get(my_url).text 
    soup = BeautifulSoup(res, "lxml") 
    for container in soup.select(".item-title"): 
     print("product_name: {}".format(container.text)) 
+0

こんにちは、@シャヒン。ご助力ありがとうございます。うん、それは完璧に機能しました!私はあなたが私にあなたのコードを理解するためにいくつかのGoogleを試したので、(lxml)を使用するように私が提案したすべてのパッケージを知っていませんでした。 私のコードについては、何がうまくいかないのか説明できますか?最初のページを何度も何度も掻き取っていた理由を理解できません。私は変更するためにループをしましたか? btw:お待ちください。私はあなたの投稿を見ましたが、私は仕事をしていましたが、私は試してみるためにPythonを持っていません。 = D –

+0

コメントが削除されました。ありがとう。 – SIM

+0

詳細を探すためにコードを改良しました: これを行うより良い方法ですか? (私は "for"で2つのループを実行しようとしました...形成なしで表示するのは恐ろしいです)-------soup.select( "。item-title")のコンテナの container:商品名:{} "。書式(container.text)) soup.select("値段 ")のshipping_containerの場合: print(" shipping_const:{} "。書式(shipping_container.text)) –

関連する問題