在之前的學(xué)習(xí)筆記3中,已經(jīng)成功爬取了一個(gè)網(wǎng)頁(yè)的數(shù)據(jù),但是我們往往爬取的內(nèi)容并不僅僅是單個(gè)頁(yè)面的內(nèi)容,而是一類所需內(nèi)容,需要連續(xù)爬取多個(gè)頁(yè)面。那如何爬取多個(gè)頁(yè)面的內(nèi)容呢?接著上一篇的內(nèi)容,還是以爬取http://bj.xiaozhu.com上短租房的信息為例。
如果想連續(xù)爬取多個(gè)網(wǎng)頁(yè)的內(nèi)容,我們需要得到2個(gè)信息:
1、每翻一頁(yè)時(shí),網(wǎng)頁(yè)的網(wǎng)址鏈接
通過觀察http://bj.xiaozhu.com網(wǎng)頁(yè),往下不斷翻頁(yè)時(shí),可以發(fā)現(xiàn)各個(gè)網(wǎng)頁(yè)所對(duì)應(yīng)的網(wǎng)頁(yè)名稱,如第2頁(yè)的網(wǎng)頁(yè)為:http://bj.xiaozhu.com/search-duanzufang-p2-0/,第3頁(yè)的網(wǎng)頁(yè)為http://bj.xiaozhu.com/search-duanzufang-p3-0/。因此可以推斷,網(wǎng)頁(yè)中P之后的數(shù)字就是控制翻頁(yè)時(shí)顯示網(wǎng)頁(yè)內(nèi)容的關(guān)鍵信息。我們可以通過如下函數(shù)找出翻頁(yè)時(shí)網(wǎng)頁(yè)的網(wǎng)址:

urls = ['http://bj.xiaozhu.com/search-duanzufang-p{}-0/'.format(number)fornumberinrange(1,10)]
這一段函數(shù)看似復(fù)雜,其實(shí)可以拆分為如下函數(shù):

for number in range(1,10):#利用for循環(huán),將1-9的數(shù)字放入number中
? ? ?urls ='http://bj.xiaozhu.com/search-duanzufang-p{}-0/'.format(number)#取出1-9頁(yè)的網(wǎng)頁(yè)
再介紹一下以上函數(shù)涉及到的兩個(gè)函數(shù):
range函數(shù)
函數(shù)語法:range(start,stop,step)
參數(shù)說明:
start: 計(jì)數(shù)從 start 開始。默認(rèn)是從 0 開始。例如range(5)等價(jià)于range(0, 5);
stop: 計(jì)數(shù)到 stop 結(jié)束,但不包括 stop。例如:range(1, 5) 是[1, 2, 3, 4]沒有5
step:步長(zhǎng),默認(rèn)為1。例如:range(0, 5) 等價(jià)于 range(0, 5, 1)
str.format()函數(shù)
Python2.6 開始,新增了一種格式化字符串的函數(shù)str.format(),它增強(qiáng)了字符串格式化的功能。
函數(shù)語法:通過{}來代替以前的%。
format 函數(shù)可以接受不限個(gè)參數(shù),位置可以不按順序。
例如:
"{} {}".format("hello", "world") # 不設(shè)置指定位置,輸出為: 'hello world'
?"{0} {1}".format("hello", "world") # 設(shè)置指定位置,輸出為: 'hello world'
?"{1} {0} {1}".format("hello", "world") # 設(shè)置指定位置,輸出為: 'world hello world'
以上函數(shù),即是尋找1-9頁(yè)網(wǎng)頁(yè)的站址。輸出內(nèi)容如下:

2、從以上單個(gè)網(wǎng)址中,尋找具體商家的網(wǎng)址鏈接
在以上http://bj.xiaozhu.com/search-duanzufang-p1-0/、http://bj.xiaozhu.com/search-duanzufang-p2-0/的鏈接中,包含了許多商家的信息,通過尋找商家信息在單個(gè)網(wǎng)址中的鏈接,進(jìn)一步找到具體的網(wǎng)址鏈接。代碼如下:

urls = ['http://bj.xiaozhu.com/search-duanzufang-p{}-0/'.format(number) for number in range(1, 10)]
for single_url in urls:#通過for循環(huán),將翻頁(yè)的單獨(dú)網(wǎng)頁(yè)存入single_url中
? ? ? url = single_url
#----------------------------------獲取翻頁(yè)時(shí)的網(wǎng)頁(yè)網(wǎng)址----------------------------------------------
wb_data = requests.get(url)#向網(wǎng)頁(yè)發(fā)送請(qǐng)求
Soup = BeautifulSoup(wb_data.text,'lxml')#解析網(wǎng)頁(yè)
links = Soup.select('#page_list > ul > li > a')#獲取商家信息
for link in links:#將抓取的商家信息通過for循環(huán),放入link中
? ? ?href = link.get('href')#抓取link中的商家網(wǎng)址鏈接
? ? ?print(href)#輸出商家網(wǎng)址鏈接
#---------------------------------尋找具體商家的網(wǎng)址鏈接--------------------------------------------
輸出結(jié)果如下:

在完成以上兩步之后,便能自動(dòng)獲得我們需要批量爬取的網(wǎng)頁(yè)信息,最后放入python學(xué)習(xí)筆記3 的代碼中,就可以開始連續(xù)爬取多個(gè)網(wǎng)頁(yè)的信息。全部的代碼如下:

最終輸出結(jié)果為:
