Übrigens können Sie anhand dieses kleinen Beispiels einige grundlegende Schritte zum Erstellen eines Crawlers erlernen.
Im Allgemeinen erfordert die Erstellung eines Crawlers die folgenden Schritte:
Anforderungen analysieren (ja, die Anforderungsanalyse ist sehr wichtig, sagen Sie mir nicht, dass Ihr Lehrer das nicht getan hat lehre dich )
Analysieren Sie den Quellcode der Webseite und arbeiten Sie mit F12 zusammen (der Quellcode der Webseite ist nicht so chaotisch wie F12, wollen Sie mich zu Tode sehen?)
Geschriebene reguläre Ausdrücke oder XPath-Ausdrücke (das zuvor erwähnte Artefakt)
Python-Crawler-Code formal schreiben
Ausführen:
Nun, lassen Sie mich Schlüsselwörter eingeben und darüber nachdenken, was soll ich eingeben? Es scheint etwas exponiert zu sein.
Eingabe
Es scheint, dass der Download begonnen hat! Großartig! , ich schaute mir die heruntergeladenen Bilder an und wow, ich hatte sofort das Gefühl, ich hätte viele Emoticons hinzugefügt ...
Okay, das war's auch schon.
„Ich möchte Bilder, möchte aber nicht online suchen“
„Am besten automatisch herunterladen“
......
Das sind die Anforderungen. Okay, beginnen wir mit der Analyse der Anforderungen. Mindestens zwei Funktionen müssen implementiert werden, eine zum Suchen nach Bildern und die andere zum automatischen Herunterladen.
Bei der Suche nach Bildern ist es am einfachsten, an das Ergebnis des Crawlens von Baidu-Bildern zu denken. Okay, gehen wir zu Baidu-Bildern, um
zu sehenDas ist im Grunde genommen ganz schön.
Lassen Sie uns versuchen, nach etwas zu suchen. Ich tippe ein schlechtes Wort ein und es erscheint eine Reihe von Suchergebnissen....
Finden Sie einfach eins. Geben Sie
Okay, wir haben viele Bilder gesehen, es wäre großartig, wenn wir alle Bilder hier durchsuchen könnten. Wir sehen, dass die URL Schlüsselwortinformationen enthält
Wir versuchen, das Schlüsselwort direkt in der URL zu ändern. Springt es?
Auf diese Weise können Sie über diese URL nach Bildern mit bestimmten Schlüsselwörtern suchen, sodass wir theoretisch nach bestimmten Bildern suchen können, ohne die Webseite öffnen zu müssen. Die nächste Frage ist, wie das automatische Herunterladen implementiert wird. Aufgrund unserer Vorkenntnisse wissen wir, dass wir die URL des Bildes mithilfe von request abrufen, es dann nach unten crawlen und als .jpg speichern können.
Dieses Projekt sollte also abgeschlossen sein.
Okay, beginnen wir mit dem nächsten Schritt, der Analyse des Quellcodes der Webseite. Hier wechsle ich zunächst zurück zur herkömmlichen Seite. Warum mache ich das? Da Baidu-Bilder derzeit den Wasserfall-Flow-Modus verwenden und die Verarbeitung sehr mühsam ist.
Hier noch ein Tipp: Wenn Sie die mobile Version crawlen können, crawlen Sie nicht die Computerversion, da der Code der mobilen Version sehr klar und einfach ist um den benötigten Inhalt zu erhalten.
Okay, ich bin wieder auf die traditionelle Version umgestiegen, aber sie hat immer noch Seitenzahlen und ist angenehm zu lesen.
Klicken wir mit der rechten Maustaste und sehen uns den Quellcode an
Was zum Teufel ist das, wie können wir das sehen? es klar! !
Zu diesem Zeitpunkt ist es an der Zeit, F12, das Entwicklertool, zu verwenden! Gehen wir zurück zur vorherigen Seite, drücken Sie F12 und die Symbolleiste unten wird angezeigt. Das eine ist das Ding in der oberen linken Ecke und das andere ist das Wechseln der mobilen Version sehr nützlich für uns. Wir verwenden hier das erste
然后选择你想看源代码的地方,就可以发现,下面的代码区自动定位到了这个位置,是不是很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吧
Das obige ist der detaillierte Inhalt vonVerwenden Sie Python, um in 5 Minuten einen automatischen Bild-Downloader zu erstellen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!