2016-12-09 5 views
0

私のデータ収集の速度に大きな影響を与えたこの不満足な問題に直面しています。私は、特定のスポーツのウェブサイトに合わせ、このカスタマイズされたWebスクラッパーを書いていると私は私のスクレーパーを呼び出して、ファイルからURLを読んで:URLLinks.txtでURLの差異が非常に小さいため、私のWebスクレーパーが散発的に失敗する

import re 
from bs4 import BeautifulSoup 
import html5lib 
import socket 
from PassesData import * 
import sys 
reload(sys) 
sys.setdefaultencoding('utf-8') 

base: http://www.something.com 
with open('Part2-PostIS-0430PM.txt', 'w') as f5: 
    with open('URLLinks.txt') as temp: 
     for url in temp: 
      f5.write(getData(base+url)) 
      f5.write("\n") 

サンプルデータ - > /何か/特徴/ 12345

クローラは、URLを1つずつ読み込んでクローラスパーシングに渡し、その結果を - >を使用して外側のテキストファイルに書き出しますが、次のようなわずかな違いでURLを読み取ると、

/someting/where/12345の代わりに12345、

私のクローラが失敗します:UnboundLocalError:割り当て前にローカル変数 'header'が参照されています:ヘッダーはheader = soup.h1.b.text.strip()のようにURLからスパースするページヘッダーです。印刷機能私が読んでいるURLの99%は完全に動作しますが、途中の1つのURLがプロセス全体を停止させてしまいます。たとえば、Google ChromeにURLを渡すと、不足している用語が自動的に修正され、私は "http://www.something.com/someting/wherein/12345"をChromeに渡すと問題なく/何か//12345を開きます。そして、ここで私はURLlinks.txtでその1つのURLを変更し、私のデータ収集に巨大な遅延を引き起こしている私のクローラを再度実行します。

これは、私が絶えずプロセスをベビーシットしなければならないので、これは大きな遅延を引き起こしました。

本当にありがとうございます。

私は再び私のクローラが完璧に動作することを強調しますが、小さな小さなためにする必要が

(彼らはちょうどウェブサイト私がスクラップ午前の作業をいけないので、urllibは、その他の方法を用いない)私はBeautifulSoup4とソケットを使用していますURLのバリエーション、/ this-is-a/link/to/this- is-a/link/toの代わりに12345/this-は/ link/to/12345であり、ブラウザは完全に理解していますが、最初のウェブサイト!

私を助けてください。ありがとうコミュニティ

+0

ChromeがURLの「someting」を「何か」に自動的に変更する例を挙げてください。それはちょうどそうではないようです – Shane

+0

クロムこれを与える:http://stackoverflow.com//questions/41051497/my-web-scraper-sporadically-due-very-small-difference-in-urls?noredirect=1#comment69311269_41051497 insted of :http://stackoverflow.com//questions/41051497/my-web-scraper-sporadically-fail-due-to-very-small-difference-in-urls?noredirect=1#comment69311269_41051497 通知に若干の違いがあります非常に小さい - >非常に小さいため DNSサーバーは、あなたが意味していたものを自動的に見つけ出し、正しいものを取得しますが、上記で提供したコードを使用すると、ごく小さな間違いでさえ許されません。 – Hesyzd

+0

これはDNSサーバーとは関係ありません。それはあなたの "間違った" URLをその質問の正式なURLにリダイレクトすることで作業をしているstackoverflowサーバーです。質問IDが正しい限り、そのURLに必要な名前を使用することができ、これはstackoverflowで受け入れられます。私はあなたが掻いているウェブサイトが同じことをすると思います。また、あなたの仕事をするために '要求'を使って私の答えをチェックすることができます。 – Shane

答えて

0

私はあなたが間違ったURLで失敗すると思われるウェブスクレイピングフレームワークscrapyを使用することもできますが、プロセスを停止しないので、他のリクエストは引き続き動作します。これは非同期でもあり、要求は独立して高速に処理されます。

0

実際に私は問題を解決しないものの、次善のことをしました。問題だったそれらのURLをログに記録しながら、それは私が通過こする継続することができますので、私はそれらを後で調べることができ、次のように私が使用したコードは次のとおりです。

with open('Part2-PostIS-Datas-7-1159AM.txt', 'w') as f5: 
    log = open("LOG-P2-7-1159.txt", 'a') 
    with open('Part2-Links-7.txt') as temp: 
     for url in temp: 
      try: 
       f5.write(getData(base+url)) 
       f5.write("\n") 
      except (KeyboardInterrupt, SystemExit): 
       raise 
      except: 
       print(url, file=log) 
       pass 

今、私は私のスクリプトを実行して、ページを一つずつこすりすることができます1%の問題のあるURLは処理全体を停止しません。私のデータ収集が終わったら、私は自分のログファイルを調べてURLを修正して、それらを再度実行しなければならないでしょう。

0

本当にあなたがスクレーピングのために使用しますが、右の例で、すべての作品requests私の側にあなたが私を与えるどのようなモジュールを知らない:

>>> import requests 
>>> response = requests.get('http://stackoverflow.com//questions/41051497/my-web-scraper-sporadically-due-very-small-difference-in-urls?noredirect=1#comment69311269_41051497') 
>>> response.url 
u'http://stackoverflow.com/questions/41051497/my-web-scraper-sporadically-fails-due-to-very-small-difference-in-urls?noredirect=1' 
>>> response = requests.get('http://stackoverflow.com//questions/41051497/how-wrong-can-the-name-be?noredirect=1') 
>>> response.url 
u'http://stackoverflow.com/questions/41051497/my-web-scraper-sporadically-fails-due-to-very-small-difference-in-urls?noredirect=1' 

あなたは関係なく見ることができないように、「間違った名前の種類"あなたが提供すると、レスポンスは301を実行し、質問番号が正しい限り、stackoverflowサーバーが要求する正しいURLにリダイレクトします。

関連する問題