2016-09-23 5 views
0

あなたはすべてうまくいきますように!私は新しいPython 2.7を使っています!私はAPIを持っていない公衆利用可能なディレクトリのウェブサイトから電子メールを抽出するつもりです:これはサイトです:http://www.tecomdirectory.com/companies.php?segment=&activity=&search=category&submit=Search
、コードは、 "より多くの負荷を!ここ は私のコードです:Python 2.7完全データベースの最後の前にBeautifulSoup電子メールの掻き取りが終了します

import requests 
import re 
from bs4 import BeautifulSoup 
file_handler = open('mail.txt','w') 

soup = BeautifulSoup(requests.get('http://www.tecomdirectory.com/companies.php?segment=&activity=&search=category&submit=Search').content) 
tags = soup('a') 
list_new =[] 
for tag in tags: 
    if (re.findall(r'href="mailto:([^"@][email protected][^"]+)">\1</a>',('%s'%tag))): list_new = list_new +(re.findall(r'href="mailto:([^"@][email protected][^"]+)">\1</a>', ('%s'%tag))) 

for x in list_new: 
    file_handler.write('%s\n'%x) 
file_handler.close() 

どのように私はコードは、ディレクトリの最後まで行くと、それはより多くの負荷を示し、ここで停止していないことを確認することができますか?おかげさまで 暖かいよろしく

+0

"load more"が少なくともいくつかのjavascriptを使用して動的に読み込まれた後、ページのすべてを推測しています。 Beautifulsoupはjavascriptを実行しないので、動的に読み込まれたコンテンツを読むことはできません。 – Kevin

+0

こんにちはKevin!返信いただきありがとうございます。この問題を回避する方法を教えてもらえますか、それともPythonにモジュールがあれば教えてください。ありがとう – PIMg021

+0

これは役に立ちそうです:[PythonでWebページをスクラップするJavaScript](0120-18753) – Kevin

答えて

1

あなただけの負荷にもっとボタンのクリックをシミュレートするためにgroup_noをインクリメント特に、いくつかのデータをポストする必要がありますすることができます、最後まで行くには

from bs4 import BeautifulSoup 
import requests 

# you can set whatever here to influence the results 
data = {"group_no": "1", 
     "search": "category", 
     "segment": "", 
     "activity": "", 
     "retail": "", 
     "category": "", 
     "Bpark": "", 
     "alpha": ""} 

post = "http://www.tecomdirectory.com/getautocomplete_keyword.php" 

with requests.Session() as s: 
    soup = BeautifulSoup(
     s.get("http://www.tecomdirectory.com/companies.php?segment=&activity=&search=category&submit=Search").content, 
     "html.parser") 
    print([a["href"] for a in soup.select("a[href^=mailto:]")]) 
    for i in range(1, 5): 
     data["group_no"] = str(i) 
     soup = BeautifulSoup(s.post(post, data=data).content, "html.parser") 
     print([a["href"] for a in soup.select("a[href^=mailto:]")]) 

ループポストを返さないのhtmlまで、私達はちょうどZさんを反復する"alpha": "Z"の設定の下のような機能を実行したのであれば

def yield_all_mails(): 
    data = {"group_no": "1", 
      "search": "category", 
      "segment": "", 
      "activity": "", 
      "retail": "", 
      "category": "", 
      "Bpark": "", 
      "alpha": ""} 

    post = "http://www.tecomdirectory.com/getautocomplete_keyword.php" 
    start = "http://www.tecomdirectory.com/companies.php?segment=&activity=&search=category&submit=Search" 
    with requests.Session() as s: 
     resp = s.get(start) 
     soup = BeautifulSoup(s.get(start).content, "html.parser") 
     yield (a["href"] for a in soup.select("a[href^=mailto:]")) 
     i = 1 
     while resp.content.strip(): 
      data["group_no"] = str(i) 
      resp = s.post(post, data=data) 
      soup = BeautifulSoup(resp.content, "html.parser") 
      yield (a["href"] for a in soup.select("a[href^=mailto:]")) 
      i += 1 

:それは私たちが、それ以上のページをロードすることはできません意味

from itertools import chain 
for mail in chain.from_iterable(yield_all_mails()): 
    print(mail) 

私たちはなるだろう:あなたは、サーバーをハンマーと自分がブロックされ得ることはありませんので、

mailto:[email protected] 
mailto:[email protected] 
mailto:[email protected] 
mailto:[email protected] 
mailto:[email protected] 
mailto:[email protected] 
mailto:[email protected] 
mailto:[email protected] 
mailto:[email protected] 
mailto:[email protected] 
mailto:[email protected] 
mailto:[email protected] 
mailto:[email protected] 
mailto:[email protected] 
mailto:[email protected] 

Process finished with exit code 0 

あなたが要求間で睡眠を置く必要があります。

+0

こんにちはPadraic!助けをいつものようにありがとう!私はコードを試しました: しかし、最初に空のリストを与え、直後に26行目にトレースバックがあります。ノンタイプのオブジェクトは呼び出し可能ではありません。 – PIMg021

+0

@ PIMg021質問出力に表示されているものは、自分でコードを実行したものです。あなたは何か違ったことをしているに違いありません。両方のリクエストとbs4のどちらのバージョンを使用していますか? –

+0

こんにちはパドレイク!私はbs4をダウンロードして昨日リクエストしているので、彼らは最新のものだと思う。どこでテストするにはアルファとzを挿入する必要がありますか? itertool import chainの部分も直前のコードの下に置かなければなりませんか? – PIMg021

関連する問題