在爬蟲的時候,我們會遇到一些問題,即使獲取到全文的url,但是可能page的連接獲取不完整,就會導致我們爬蟲的時候,比如說爬商品信息,就會拿不完整商品信息。
頁面信息大概有這兩種情況:
第一種:
1,2,3,4,5,...,next,last
第二種:
1,2,3,4,5,>
實現語言:ruby or python(提供兩種)
爬蟲工具:selenium
先說說第一種情況:我們在當前層的時候可以拿到1,2,3,4,5,next,last對應的page頁面的url,但是...的頁面信息獲取不到,可能這里面有好多頁面,例如所有的頁面可能是1,2,3,4,5,6,7,8,如果這種情況我們就拿不到6,7這兩頁,那怎么辦呢?
首先呢,如果last告訴我們最后一個page頁面的信息,我們可以直接拿last的頁面信息的對應的數字,就是所有的page總數,再提出一個網址page頁面的前綴,我們即可以直接拼湊,來獲取到page的頁面數量,以及page的鏈接,我們來看一個例子:
url:https://www.evesaddiction.com/all-necklaces/213
#ruby實現的代碼
def get_allpage(driver) #獲取當前所有page頁面對應的li page_mes=driver.find_element(:css,"div.pagination").find_elements(:tag_name,"li") #我們取到所有頁面的數量 total_page_len = page_mes[page_mes.length-1].attribute("outerHTML").scan(/href=\"(.*?)\"/)[0][0].scan(/page=(\d+)/)[0][0] #提取page前面的url信息 #url前綴就是"https://www.evesaddiction.com/all-necklaces/213?" #url后綴就是page=1,2,3,4..total_page_len page_url = page_mes[page_mes.length-1].attribute("outerHTML").scan(/href=\"(.*?)\"/)[0][0].scan(/(.*?)page/)[0][0] #最后將結果返回 return page_url,total_page_len end
#python
def get_allpage(driver): page_mes=driver.find_element_by_css_selector("div.pagination").find_elements_by_tag_name("li") total_page_len=re.findall(r'page=(\d+)',page_mes[len(page_mes)-1].get_attribute("outerHTML"))[0] page_url=re.findall(r'href=\"(.*?)page',page_mes[len(page_mes)-1].get_attribute("outerHTML"))[0] return total_page_len,page_url
第二種情況,就是要一路點到底,才知道當前的頁面數量
url:https://www.tous.com/us-en/watches/?p=8
當在第八頁的時候是這樣子的
第九頁的時候是這樣子的
我們就用這個箭頭的符號定位獲取,判斷他是否存在來判斷是否我們已經點到最后了,也是實現拼接獲取,前綴是url的前綴信息,后綴是page的頁面
#ruby實現的代碼
def get_all_page(driver) running=true total_page_len="" page_url="" while running page_mes=driver.find_element(:css,"div.pages").find_elements(:tag_name,"li") begin if page_mes[page_mes.length-1].attribute("outerHTML").scan(/next i-next/)[0][0].length > 0 driver.find_element(:css,"div.pages ol li a.next").click() end rescue total_page_len=page_mes[page_mes.length-1].text page_url=page_mes[page_mes.length-2].attribute("outerHTML").scan(/href=\"(.*?)\"/)[0][0].scan(/(.*?)p=/)[0][0] running = false end
end return total_page_len,page_url end
執行結果:然后拼接一下就可以啦
#python代碼
def get_all_page(driver): running=True total_page_len="" page_url="" while running: page_mes=driver.find_element_by_css_selector("div.pages").find_elements_by_tag_name("li") if len(re.findall(r'next i-next',page_mes[len(page_mes)-1].get_attribute("outerHTML")))>0: driver.find_element_by_css_selector("div.pages ol li a.next").click() else: total_page_len=page_mes[len(page_mes)-1].text page_url=re.findall(r'href=\"(.*?)p=',page_mes[len(page_mes)-2].get_attribute("outerHTML"))[0] running=False return total_page_len,page_url
獲取頁面的page其實就是 page的url + page id