ちなみに、この小さな例を通じて、クローラーを作成するための基本的な手順をいくつかマスターできます。
一般的に言えば、クローラーを作成するには次の手順が必要です:
要件を分析する (はい、要件分析は非常に重要です。先生が教えてくれなかったとは言わないでください)
Web ページのソースを分析するコードを作成し、F12 と連携します (F12 ほど厄介な Web ページのソース コードはありません。死ぬほど私に会いたいですか?)
正規表現または XPath 式 (前述のアーティファクト) を作成します
正式に作成しますPython クローラー コード
実行:
さて、キーワードを入力しましょう、考えさせてください、何を入力すればよいでしょうか?少し露出しているようです。
Enterキーを押してください
ダウンロードが始まったようです!素晴らしい! , ダウンロードした写真を見てみると、おお、顔文字をたくさん追加したような気がしました...
まあ、これで十分です。
「写真が欲しいけどネットで検索するのは面倒」
「自動でダウンロードするのがベスト」
...
これが需要です、わかりました、需要の分析を始めて実装しましょう少なくとも 2 つの機能があり、1 つは写真の検索、もう 1 つは自動的にダウンロードします。
まず、画像を検索するときに一番簡単に思いつくのは、Baidu の写真をクロールした結果です。それでは、Baidu の写真に行って見てみましょう
基本的にはこんな感じです。美しい。
何かを検索しようとして、単語を入力すると、一連の検索結果が表示されます。これは何を意味しますか...
Enter キーを見つけてください
写真がたくさんあるので、ここにあるすべての写真をたどることができれば素晴らしいと思います。ウェブサイトにキーワード情報があることがわかりました
ウェブサイトでキーワードを直接変更しようとしましたが、ジャンプしましたか?
このように、この URL から特定のキーワードの写真を検索できるので、理論上は Web ページを開かずに特定の写真を検索することができます。次の質問は、自動ダウンロードを実装する方法です。実際、これまでの知識を使用すると、リクエストを使用して画像の URL を取得し、それをクロールして .jpg として保存できることがわかります。
それで、このプロジェクトは完了するはずです。
それでは、次のステップである Web ページのソース コードを分析しましょう。ここで最初に従来のページに戻ります。これは、Baidu の画像が現在ウォーターフォール フロー モードを使用しているため、処理が非常に面倒です。従来のページめくりインターフェイスの方がはるかに優れています。
もう 1 つのヒント: モバイル バージョンをクロールできる場合は、コンピューター バージョンをクロールしないでください。モバイル バージョンのコードは非常に明確で、必要なコンテンツを簡単に取得できるからです。
はい、従来のバージョンに戻しましたが、ページ番号も付いているので快適に読めます。
右クリックしてソースコードを表示してみましょう
これは一体何ですか、どうすればはっきりと見えるのでしょうか。 !
この時点で、開発者ツールの F12 を使用します。前のページに戻り、F12 を押すと、下のツールバーが表示されます。使用する必要があるのは、左上隅にあるツールです。もう 1 つはモバイル バージョンの切り替えです。私たちにとってとても役に立ちます。ここでは最初のものを使用します
然后选择你想看源代码的地方,就可以发现,下面的代码区自动定位到了这个位置,是不是很NB!
我们复制这个地址
然后到刚才的乱七八糟的源代码里搜索一下,发现它的位置了!(小样!我还找不到你!)但是这里我们又疑惑了,这个图片怎么有这么多地址,到底用哪个呢?我们可以看到有thumbURL,middleURL,hoverURL,objURL
通过分析可以知道,前面两个是缩小的版本,hover是鼠标移动过后显示的版本,objURL应该是我们需要的,不信可以打开这几个网址看看,发现obj那个最大最清晰。
好了,找到了图片位置,我们就开始分析它的代码。我看看是不是所有的objURL全是图片
貌似都是以.jpg格式结尾的,那应该跑不了了,我们可以看到搜索出61条,说明应该有61个图片
通过前面的学习,写出如下的一条正则表达式不难把?
pic_url = re.findall('"objURL":"(.*?)",',html,re.S)
好了,正式开始编写爬虫代码了。这里我们就用了2个包,一个是正则,一个是requests包,之前也介绍过了,没看的回去看!
#-*- coding:utf-8 -*-import reimport requests
然后我们把刚才的网址粘过来,传入requests,然后把正则表达式写好
url = 'http://image.baidu.com/search/flip?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=result&fr=&sf=1&fmq=1460997499750_R&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&word=%E5%B0%8F%E9%BB%84%E4%BA%BA' html = requests.get(url).text pic_url = re.findall('"objURL":"(.*?)",',html,re.S)
理论有很多图片,所以要循环,我们打印出结果来看看,然后用request获取网址,这里由于有些图片可能存在网址打不开的情况,加个5秒超时控制。
pic_url = re.findall('"objURL":"(.*?)",',html,re.S) i = 0for each in pic_url:print eachtry: pic= requests.get(each, timeout=10)except requests.exceptions.ConnectionError:print '【错误】当前图片无法下载'continue
好了,再就是把网址保存下来,我们在事先在当前目录建立一个picture目录,把图片都放进去,命名的时候,用数字命名把
string = 'pictures\\'+str(i) + '.jpg' fp = open(string,'wb') fp.write(pic.content) fp.close() i += 1
整个代码就是这样:
#-*- coding:utf-8 -*- import re import requests url = 'http://image.baidu.com/search/flip?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=result&fr=&sf=1&fmq=1460997499750_R&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&word=%E5%B0%8F%E9%BB%84%E4%BA%BA'html = requests.get(url).text pic_url = re.findall('"objURL":"(.*?)",',html,re.S)i = 0for each in pic_url: print each try: pic= requests.get(each, timeout=10) except requests.exceptions.ConnectionError: print '【错误】当前图片无法下载' continue string = 'pictures\\'+str(i) + '.jpg' fp = open(string,'wb') fp.write(pic.content) fp.close()i += 1
我们运行一下,看效果(什么你说这是什么IDE感觉很炫!?赶紧去装Pycharm,Pycharm的配置和使用看这个文章!)!
好了我们下载了58个图片,咦刚才不是应该是61个吗?
我们看,运行中出现了有一些图片下载不了
我们还看到有图片没显示出来,打开网址看,发现确实没了。
所以,百度有些图片它缓存到了自己的机器上,所以你还能看见,但是实际连接已经失效
好了,现在自动下载问题解决了,那根据关键词搜索图片呢?只要改url就行了,我这里把代码写下来了
word = raw_input("Input key word: ") url = 'http://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word='+word+'&ct=201326592&v=flip'result = requests.get(url)
好了,享受你第一个图片下载爬虫吧!!当然不只能下载百度的图片拉,依葫芦画瓢,你现在应该做很多事情了,比如爬取头像,爬淘宝展示图,或是...美女图片,捂脸。一切都凭客官你的想象了,当然,作为爬虫的第一个实例,虽然纯用request已经能解决很多问题了,但是效率还是不够高,如果想要高效爬取大量数据,还是用scrapy吧
以上がPython を使用して 5 分で自動画像ダウンローダーを作成するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。