IP抗登るには、主要な空きが多いサイトのブロックあまりにも頻繁にIPにアクセスするには、一定の期間を意味するので、一定の時間間隔を設定するには、しかし、正直に言うと必要性をクロールするとき、フリーエージェントは、非常に多くの場合、基本的な使用していません、千ダウンのみダースを使用することができるが、数分後フラッターストリートを推定することがあります。ありますが、多数のエージェントはそのIPを支払ったが、必ずしも良好ではない、テストされ、高品質の内側に非常に小さいです。より良い存在の経験や民間の機関では、当然のことながら、他のがあります。あなたの真実を持っています。
インポート要求が インポート時間 インポートランダムに から fake_useragent 輸入のUserAgent から requests.exceptions インポートRequestExceptionを から lxmlのインポートetree インポートCSV形式の クラスIPSpider(オブジェクト): デフ __init__ (自己): self.url = " https://www.kuaidaili.com/free / INHA / ' self.url_test = ' http://www.baidu.com/ " #直接拿百度来测试IP能不能用 デフget_headers(自己): "" " ランダムに生成されたリクエストヘッダ :リターン: " "" UA = ユーザーエージェント() ヘッダー = { ' ユーザーエージェント' :ua.random } 戻りヘッダ DEF get_page(セルフ、URL): "" " ゲットページのソース :PARAM URL: :リターン: "" " しばらく真: 試してみる: ヘッダ = self.get_headers() レスポンスRequests.getは=(URL、ヘッダ=ヘッダ、=を確認してください偽) IF response.status_codeの== 200 : 返すresponse.text 印刷(response.status_code) 昇給とValueError(" Webページのエラーを開く" ) を除くERR AS requestexception: 印刷(ERR ) DEF PARSE_IP(セルフ、テキスト): "" " IPとポート番号の抽出ページ :PARAMテキスト: :リターン: " "" HTML = etree.HTML(テキスト) IP = html.xpath(" // TR / TD [1] /テキスト()" ) 印刷(IP) ポート = html.xpath(" // TR / TD [2] /テキスト()" ) 印刷(ポート) リターンZIP(IP、ポート) デフtest_ip(自己、IP、ポート): "" " 测试IP是否可用 :PARAM IP: :PARAMポート: :リターン :""" してみてください: #1 url_ip = 'のhttp://' + IP + ':' +ポート #のプロキシ= { # 'のhttp':url_ip、 # 'HTTPS':url_ip #} プロキシ= { ' HTTP ':' のhttp:// {}:{} ' .format(IP、ポート)、 ' HTTPS ':' のhttps:// {}:{} ' .format(IP、ポート) } ヘッダー = self.get_headers() 応答 = requests.get(URL = self.url_test、ヘッダー=ヘッダ、プロキシの=プロキシ、タイムアウト= 8 ) 場合 response.status_codeの== 200 : 印刷(" %sの可用"%のIP) 返すIP、ポート 戻りなしを 除いてRequestException: 印刷(' %sの失效'%IP) デフsave_ip(自己、結果): "" " 可用的IP保存 :PARAM結果を: :リターン :""" オープン(と" kuaidailiip。 CSV " " A " Fなど): ライター = csv.writer(F) writer.writerows(結果) デフ自己(実行 ):""" 主な機能 :リターン :""」 のための I における範囲(1 1001 ): URL = self.url + STR(I)+ ' / ' テキスト = self.get_page(URL) IP = self.parse_ip(テキスト) 結果 = [] 以下のための J でのIP: ok_ip = self.test_ip(J [0]、J [1 ]) 場合 ok_ipは== なし: 続けない 他: result.append(ok_ip) self.save_ip(結果) time.sleep( random.randint(5,7))
もし__name__ == ' __main__ ' :
クモ = IPSpider()
spider.run()