最初の爬虫類:恥をかく百科のジョーク
7506 ワード
前の列のヒント: Python 3.5 分散キューなし、重量チェックなし、Scrapy-Redisフレームワークなし、効率なし 参考資料(前列拝礼);ネットユーザー静捜 CSDNコラム Jecvay Notes 知乎大神、簡潔 第一歩:登ればいい
このような数行のコードを通じて、私たちは1つのインタフェースをつかむことができて、htmlコードを返します.しかし、このような爬虫類は1つのインターフェースしか登れないので、連続的に登りたいならどうすればいいのでしょうか.
ステップ2:連続して登る
連続して登りたい場合は、登ったページに他のページにリンクされたURLを見つける必要があります.ここでは正規表現でマッチングする必要があります.一致したURLは1つのキューに格納する必要があります.そうすれば、アクセスを継続できます.大型爬虫類はScrapy-Redisフレームワークを採用している.同時に、重複しないように、どのURLがアクセスされたかを記録するためのキューも維持されます.この簡単な重量検査方法はset()容器で実現できる.しかしset要素が大きくなるにつれて消費は線形に増加する.大型爬虫類はBloom Filterを採用しています.
上記のコードのURLマッチングルールは粗末で、URLではない可能性があるので、この正規表現はもっと正確に書く必要があります.上記コードのdataは、最初のステップで得られたdataである.このdataはdecodeで処理しなければならないので、エラーが発生します.キューのURLを格納することで、爬虫類は絶えずURLを得ることができ、setの要素と比較することで、重複したURLへのアクセスを避けることができます.しかし、アクセスしたURLが無効だったり、サーバーが応答しなかったりしたら、どうすればいいですか?
ステップ3:例外処理
ブラウザを使用すると、ページにアクセスできない場合があります.最も一般的なのは404です.404はhttpのステータスコードで、アクセスするページが見つからないことを意味します.このとき、ブラウザからページを閉じるといいです.しかしpython爬虫類でこのようなエラーが発生すると、爬虫類全体がクラッシュし、作業が停止します.以下、エラー処理方式を示す.
コードの中の処理方法は暴力的で、直接アクセスできないURLを省略して、アクセスできない原因を知らない.アクセスできない理由の1つは、サーバが応答を拒否することです.現在、ほとんどのサイトでは爬虫類が這うことが禁止されているので、爬虫類がサーバーと対話している間に、サーバーが爬虫類であることに気づいたら、あなたのすべての要求を拒否します(例えば京東、宝を洗って、直接這うのはだめです).この時、爬虫類をブラウザに偽装する必要があります.
ステップ4:ブラウザに偽装
ブラウザに偽装するのは簡単に言えば、あなたのリクエストにヘッダ情報を追加することです.最も重要なのはUser-Agentパラメータです.ヘッダ情報とは?ブラウザが教えてくれます.ブラウザデバッグインタフェースを開く(Chromeです.F 12を直接押すと出てきます)、最上階のNetworksを選択し、ブラウザのアドレスバーにURLを出入りして、車に戻ると、デバッガにたくさんのリクエストが出てきます.jsとか、画像とか、cssとか、勝手にリクエストをクリックして、右側でheadersを選択します.headersの最後のアイテムはUser-Agentです.コピーして、辞書の形でheaderに保存します.sの中にあります.
以上の構成では、サーバはあなたがブラウザだと思ってリクエストを拒否しません.次に、静的なHTMLコードを正規にキャプチャすることができます.正規表現をうまく使えば、欲しいものを簡単に手に入れることができます.しかし、ダイナミックなものをつかむには、他の知識が必要です.
に付随
私の恥ずかしい百科事典のジョークを捕まえて保存した爬虫類.
読んだジョークのスクリーンショット
import urllib
import urllib.request
url = "http://news.dbanotes.net"
html = urllib.request.urlopen(url)
data = html.read().decode('UTF-8')
print(data)
このような数行のコードを通じて、私たちは1つのインタフェースをつかむことができて、htmlコードを返します.しかし、このような爬虫類は1つのインターフェースしか登れないので、連続的に登りたいならどうすればいいのでしょうか.
ステップ2:連続して登る
連続して登りたい場合は、登ったページに他のページにリンクされたURLを見つける必要があります.ここでは正規表現でマッチングする必要があります.一致したURLは1つのキューに格納する必要があります.そうすれば、アクセスを継続できます.大型爬虫類はScrapy-Redisフレームワークを採用している.同時に、重複しないように、どのURLがアクセスされたかを記録するためのキューも維持されます.この簡単な重量検査方法はset()容器で実現できる.しかしset要素が大きくなるにつれて消費は線形に増加する.大型爬虫類はBloom Filterを採用しています.
import re
from collections import deque
queue = deque()
queue.append('www.baidu.com')#
visited = set()
while queue:
url = queue.popleft()
visited |= url
linkre = re.compile(r'href="(.+?)"')
for x in linkre.findall(data):
if (len(queue) < 100 and x not in visited):
queue.append(x)
上記のコードのURLマッチングルールは粗末で、URLではない可能性があるので、この正規表現はもっと正確に書く必要があります.上記コードのdataは、最初のステップで得られたdataである.このdataはdecodeで処理しなければならないので、エラーが発生します.キューのURLを格納することで、爬虫類は絶えずURLを得ることができ、setの要素と比較することで、重複したURLへのアクセスを避けることができます.しかし、アクセスしたURLが無効だったり、サーバーが応答しなかったりしたら、どうすればいいですか?
ステップ3:例外処理
ブラウザを使用すると、ページにアクセスできない場合があります.最も一般的なのは404です.404はhttpのステータスコードで、アクセスするページが見つからないことを意味します.このとき、ブラウザからページを閉じるといいです.しかしpython爬虫類でこのようなエラーが発生すると、爬虫類全体がクラッシュし、作業が停止します.以下、エラー処理方式を示す.
try:
html = urllib.request.urlopen(url, timeout = 100)#
data = html.read().decode('UTF-8')
except:
continue
コードの中の処理方法は暴力的で、直接アクセスできないURLを省略して、アクセスできない原因を知らない.アクセスできない理由の1つは、サーバが応答を拒否することです.現在、ほとんどのサイトでは爬虫類が這うことが禁止されているので、爬虫類がサーバーと対話している間に、サーバーが爬虫類であることに気づいたら、あなたのすべての要求を拒否します(例えば京東、宝を洗って、直接這うのはだめです).この時、爬虫類をブラウザに偽装する必要があります.
ステップ4:ブラウザに偽装
ブラウザに偽装するのは簡単に言えば、あなたのリクエストにヘッダ情報を追加することです.最も重要なのはUser-Agentパラメータです.ヘッダ情報とは?ブラウザが教えてくれます.ブラウザデバッグインタフェースを開く(Chromeです.F 12を直接押すと出てきます)、最上階のNetworksを選択し、ブラウザのアドレスバーにURLを出入りして、車に戻ると、デバッガにたくさんのリクエストが出てきます.jsとか、画像とか、cssとか、勝手にリクエストをクリックして、右側でheadersを選択します.headersの最後のアイテムはUser-Agentです.コピーして、辞書の形でheaderに保存します.sの中にあります.
url = deque.popleft()
request = urllib.request.Request(url, headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko)\
Chrome/50.0.2657.3 Safari/537.36'
})
html = urllib.request.urlopen(request)
以上の構成では、サーバはあなたがブラウザだと思ってリクエストを拒否しません.次に、静的なHTMLコードを正規にキャプチャすることができます.正規表現をうまく使えば、欲しいものを簡単に手に入れることができます.しかし、ダイナミックなものをつかむには、他の知識が必要です.
に付随
私の恥ずかしい百科事典のジョークを捕まえて保存した爬虫類.
#
import re
import urllib
import urllib.request
# , 、 , 。
def saveData(data, savePath):
f = open(savePath, 'a')
try:
f.write(data)
except:
pass
f.close()
cnt = 1
#
rule_joke = r'((?:.|[\r
])*?)'
savePath = 'E:\qb_jokes.txt'
url_header = 'http://www.qiushibaike.com/8hr/page/'
url_tail = 1
while url_tail < 30:
# ,
url = url_header + str(url_tail)
request = urllib.request.Request(url, headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko)\
Chrome/50.0.2657.3 Safari/537.36'
})
# ,
try:
html = urllib.request.urlopen(request)
data = html.read()
except:
print('Parser Html Error!')
continue
#
jokes = re.compile(rule_joke)
try:
joke = jokes.findall(data.decode("UTF-8"))
except:
print("Find jokes error!
")
continue
#
for j in joke:
print(str(cnt) + j + "
")
saveData(str(cnt) + j + "
", save_path)
cnt += 1
#
url_tail += 1
読んだジョークのスクリーンショット