极简单之爬虫入门
1. 爬蟲(chóng)是什么
爬蟲(chóng)(Spider),這里當(dāng)然不是說(shuō)結(jié)網(wǎng)捉蟲(chóng)的蜘蛛那樣的生物學(xué)上的爬蟲(chóng),這里說(shuō)的是互聯(lián)網(wǎng)上的爬蟲(chóng),由程序員編寫(xiě),具有一定的邏輯性能夠完成在指定范圍內(nèi)進(jìn)行信息收集的程序。
據(jù)說(shuō)爬蟲(chóng)占據(jù)了互聯(lián)網(wǎng)上60%多的流量,可想而知這個(gè)無(wú)比龐大的互聯(lián)網(wǎng)上有多少只辛辛苦苦矜矜業(yè)業(yè)的爬蟲(chóng)們啊。
爬蟲(chóng),主要分為搜索引擎類(lèi)的爬蟲(chóng)和具有一定目標(biāo)的專(zhuān)用爬蟲(chóng)。前者索引整個(gè)web世界,讓人們能方便的搜索到自己想要的信息,一般網(wǎng)站也很歡迎這些爬蟲(chóng)。而后者有時(shí)候目的性比較強(qiáng),爬取范圍也比較窄,一般收集數(shù)據(jù)用于二次加工或者數(shù)據(jù)分析等。這里主要講的就是第二種爬蟲(chóng)。
2. 爬蟲(chóng)怎么工作
爬蟲(chóng)的工作很簡(jiǎn)單,一句話(huà)概括就是找到目標(biāo)入口然后在目標(biāo)頁(yè)面獲取目標(biāo)內(nèi)容。
爬蟲(chóng)的原理也不復(fù)雜,主要是通過(guò)http或者其他協(xié)議,發(fā)送請(qǐng)求到目標(biāo)接口,然后解析返回的內(nèi)容成結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)到本地。
3. 怎么制作爬蟲(chóng)
制作一個(gè)爬蟲(chóng)基本需要如下步驟:
- 確定目標(biāo):
制作爬蟲(chóng)首先需要清楚自己的目的,希望獲取哪些信息。 - 觀察目標(biāo):
然后通過(guò)觀察目標(biāo)網(wǎng)站或者程序,獲取目標(biāo)信息的入口和索引方式。 - 結(jié)構(gòu)提取:
進(jìn)入內(nèi)容頁(yè)面,觀察感興趣區(qū)域的頁(yè)面結(jié)構(gòu),然后考慮通過(guò)正則表達(dá)式或者xpath等方式提取目標(biāo)內(nèi)容。 - 編碼實(shí)現(xiàn):
前3步完成之后,最后就是使用線程工具或者自己編碼實(shí)現(xiàn)這個(gè)爬蟲(chóng)了。
完成這些,基本上就可以認(rèn)為制作出來(lái)一個(gè)網(wǎng)絡(luò)爬蟲(chóng)了,然后就是讓這個(gè)爬蟲(chóng)啟動(dòng)運(yùn)行起來(lái)。至于怎么處理爬到的數(shù)據(jù),那就不是爬蟲(chóng)的事了。
下面介紹2種爬蟲(chóng)制作方法。
4. 使用工具制作爬蟲(chóng)
由于爬蟲(chóng)這種需求比較多,所以網(wǎng)絡(luò)上有一些專(zhuān)門(mén)的工具,能通過(guò)簡(jiǎn)單的配置就能制作爬蟲(chóng)。
推薦一個(gè)國(guó)內(nèi)軟件商制作的比較傻瓜式的爬蟲(chóng)生成工具:火車(chē)采集器,免費(fèi)版基本就夠用了。
具體用法參考其視頻教程,基本上看完視頻就能知道怎么用了。
這個(gè)對(duì)于一些簡(jiǎn)單的場(chǎng)景基本夠用了,主要優(yōu)勢(shì)是配置簡(jiǎn)單,搭建方便,傻瓜化運(yùn)行。
5. 編寫(xiě)代碼制作爬蟲(chóng)
在現(xiàn)有工具無(wú)法滿(mǎn)足需求或者想要學(xué)習(xí)爬蟲(chóng)的原理的時(shí)候,也可以通過(guò)編寫(xiě)代碼來(lái)制作爬蟲(chóng)。
當(dāng)然,也不需要要從tcp/ip或者h(yuǎn)ttp協(xié)議這么底層開(kāi)始,可以通過(guò)一些開(kāi)源的爬蟲(chóng)框架來(lái)編寫(xiě)爬蟲(chóng)。其中以python語(yǔ)言作為基礎(chǔ)的爬蟲(chóng)框架比較多,這里以scrapy為例。
scrapy是一個(gè)開(kāi)源的python爬蟲(chóng)框架,也是目前最流行的爬蟲(chóng)框架之一,里面集成了一些爬蟲(chóng)常用的功能,基本上只需要寫(xiě)爬蟲(chóng)的邏輯就行。
以一個(gè)最簡(jiǎn)單的例子來(lái)說(shuō)明scrapy的用法。
5.1 確定目標(biāo)
需要有一個(gè)爬蟲(chóng)每天去查詢(xún)百度搜索“爬蟲(chóng)”的前2頁(yè)搜索結(jié)果,然后分析新排序到前2頁(yè)的搜索結(jié)果(其他后處理)。
5.2 觀察目標(biāo)
首先在百度輸入“爬蟲(chóng)”搜索,跳轉(zhuǎn)到搜索結(jié)果頁(yè)。觀察結(jié)果頁(yè)面的URL結(jié)果,可以看到:
-
第1頁(yè)URL:
https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&tn=baidu&wd=%E7%88%AC%E8%99%AB&oq=%E7%88%AC%E8%99%AB&rsv_pq=9fd63f8600011b0b&rsv_t=3b30%2BHymEU5wSsRM5DGZD1gCwRjvljkpEIr3hXU0nOba6AHvpIdgH6DokZ4&rqlang=cn&rsv_enter=0&rsv_sug3=1&rsv_sug1=1&rsv_sug7=100&rsv_sug4=470
-
第2頁(yè)URL:
https://www.baidu.com/s?wd=%E7%88%AC%E8%99%AB&pn=10&oq=%E7%88%AC%E8%99%AB&ie=utf-8&usm=1&rsv_pq=cb75075a0001681d&rsv_t=0986khHCUHLdfml7ymZib2JecfTLlPX%2Ft57JycxSQwzQh5miPsj1IKCeEGQ&rsv_page=1
URL里面有不少參數(shù),可能用不著,所以試著簡(jiǎn)化這個(gè)URL:
-
第1頁(yè)URL:
https://www.baidu.com/s?wd=爬蟲(chóng)&pn=0
-
第2頁(yè)URL:
https://www.baidu.com/s?wd=爬蟲(chóng)&pn=10
那么爬蟲(chóng)的入口就知道了。
5.3 結(jié)構(gòu)提取
scrapy用的是xpath做結(jié)構(gòu)解析,所以這里需要獲取到目標(biāo)區(qū)域的xpath。xpath是什么參考這里。
chrome瀏覽器有一個(gè)很好的插件可以很方便的獲取到某個(gè)html節(jié)點(diǎn)的xpath,XPath Helper,先安裝好它。
打開(kāi)chrome,輸入U(xiǎn)RL(https://www.baidu.com/s?wd=爬蟲(chóng)&pn=0),然后F12進(jìn)入開(kāi)發(fā)者模式。通過(guò)鼠標(biāo)找到第1個(gè)搜索結(jié)果的html節(jié)點(diǎn),然后右鍵:copy-Copy XPath。
得到搜索結(jié)果html節(jié)點(diǎn)的xpath分別是:
第1頁(yè)1-10搜索結(jié)果: //*[@id="1"]/h3/a //*[@id="2"]/h3/a ... //*[@id="10"]/h3/a 第2頁(yè)11-20搜索結(jié)果: //*[@id="11"]/h3/a //*[@id="12"]/h3/a ... //*[@id="20"]/h3/a那么目標(biāo)區(qū)域的xpath就很明顯了,獲取到xpath之后得到href屬性和text結(jié)果就行了。
當(dāng)然也可以通過(guò)其他的xpath獲取到這些節(jié)點(diǎn)位置,這個(gè)并不是唯一的。
5.4 編碼實(shí)現(xiàn)
scrapy安裝這里不再贅述,通過(guò)pip install scrapy即可安裝,國(guó)內(nèi)可以把pip的源設(shè)置為阿里云或者豆瓣的源,然后執(zhí)行上述命令安裝。
本節(jié)全部代碼在:baidu_spider
進(jìn)入工作目錄,命令行輸入:
scrapy startproject baidu_spider然后進(jìn)入baidu_spider目錄,打開(kāi)items.py,輸入如下代碼:
# -*- coding: utf-8 -*- import scrapy class BaiduSpiderItem(scrapy.Item): # define the fields for your item here #搜索結(jié)果的標(biāo)題 title = scrapy.Field() #搜索結(jié)果的url url = scrapy.Field()這里定義的是爬蟲(chóng)爬取結(jié)果的結(jié)構(gòu),包含搜索結(jié)果的標(biāo)題和搜索結(jié)果的url。
打開(kāi)settings.py,修改下面行:
#ROBOTSTXT_OBEY = True ROBOTSTXT_OBEY = False這個(gè)修改是因?yàn)榘俣鹊膔obots.txt禁止其他爬蟲(chóng)去爬它,所以需要把robots協(xié)議這個(gè)君子協(xié)定暫時(shí)單方面關(guān)掉。
然后進(jìn)入spider目錄,新建baiduSpider.py,輸入下面代碼:
# -*- coding: UTF-8 -*- import scrapy from scrapy.spiders import CrawlSpider from scrapy.selector import Selector from scrapy.http import Request from baidu_spider.items import BaiduSpiderItem from selenium import webdriver import time class BaiduSpider(CrawlSpider): name='baidu_spider' def start_requests(self): #函數(shù)名不可更改,此函數(shù)定義了爬蟲(chóng)的入口地址 #使用瀏覽器訪問(wèn) self.browser = webdriver.Chrome('d:/software/chromedriver.exe') for i in range(0,20,10): url = 'https://www.baidu.com/s?wd=爬蟲(chóng)&pn=%d' % i yield self.make_requests_from_url(url) def parse(self, response): #函數(shù)名不可更改,此函數(shù)定義了爬蟲(chóng)的頁(yè)面解析 #打開(kāi)瀏覽器訪問(wèn)頁(yè)面 self.browser.get(response.url) time.sleep(1) selector = Selector(text=self.browser.page_source) page_start = int(response.url.split('=')[-1]) for i in range(1,11): item = BaiduSpiderItem() xpath = '//*[@id="%d"]/h3/a' % (page_start+i) print xpath print selector.xpath(xpath + '/@href').extract() item['url'] = selector.xpath(xpath + '/@href').extract()[0] item['title'] = selector.xpath(xpath + '//text()').extract() yield item這里用到了selenium和chrome webdriver,用于使用chrome模擬正常用戶(hù)的訪問(wèn),這是因?yàn)榘俣茸隽朔琅老x(chóng)的措施,所以為了簡(jiǎn)單,我們就假裝我們的爬蟲(chóng)就是正常用戶(hù)。
selenium通過(guò)pip安裝即可,chrome webdriver在此處下載,然后安裝上。把baiduSpider.py中的webdriver.Chrome行中的可執(zhí)行文件地址改成自己的安裝地址。
全部代碼編寫(xiě)完畢,在scrapy.cfg那一層目錄(頂層)中輸入下面的命令啟動(dòng)爬蟲(chóng):
scrapy crawl baidu_spider -o result.csv一切順利的話(huà)會(huì)輸出一些log,并且啟動(dòng)chrome打開(kāi)網(wǎng)頁(yè),最后生成result.csv文件,文件內(nèi)包含了爬取到的結(jié)果。
本節(jié)全部代碼在:baidu_spider
6. 爬蟲(chóng)進(jìn)階
爬蟲(chóng)的進(jìn)階就是需要與數(shù)據(jù)來(lái)源方斗智斗勇了,處理包括但不限于以下問(wèn)題:
- IP被封禁
- 訪問(wèn)次數(shù)受限制
- 爬取速度太慢
- 頁(yè)面重定向
- 頁(yè)面ajax生成內(nèi)容
- 頁(yè)面內(nèi)容由復(fù)雜的javascript生成
- etc.
轉(zhuǎn)載于:https://www.cnblogs.com/xieqing/p/6520203.html
總結(jié)
- 上一篇: 多线程在javaweb中的应用
- 下一篇: Cogs 727. [网络流24题] 太