當需要的信息要經過兩個鏈接才能打開的時候,就需要用到嵌套爬取。
比如要爬取起點中文網排行榜的小說簡介,找到榜單網址:https://www.qidian.com/all?orderId=&style=1&pageSize=20&siteid=1&pubflag=0&hiddenField=0&page=1
將榜單上的小說鏈接爬出來,在從小說鏈接里面爬小說簡介
import pymysql import requests from hashlib import md5 import re import os #獲取網頁源代碼 def get_one_page(url): # 設置請求頭,防止被網站屏蔽 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64)\ AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36', } try: r = requests.get(url, headers=headers) r.raise_for_status() r.encoding = r.apparent_encoding return r.text except requests.HTTPError as e: print("由於某種原因獲取頁面出現錯誤!"+str(e)) #爬出目標信息所在的網址 def parse_page1(url,list): #獲取網頁內容 html=get_one_page(url) #將正則表達式編譯成正則表達式對象 pattern=re.compile('<h4><a href="(.*?)" target="_blank" data-eid',re.S) #正則表達式1匹配的是目標信息的網址 contents = re.findall(pattern, html) for i in contents: list.append(i)#向列表添加對象 return list #從網址中爬出目標信息 def parse_page2(url,list):#信息 #獲取網頁內容 url='https:'+url#############要注意爬出的網址是否完整,不完整記得補全,否則會出錯 html=get_one_page(url) #將正則表達式編譯成正則表達式對象 pattern=re.compile('<p class="intro">(.*?)</p>',re.S) #正則表達式2匹配的是目標信息 contents = re.findall(pattern, html) for i in contents: list.append(i)#向列表添加對象 return list # info_list存的是目標信息的網址 info_list=[] start_url='https://www.qidian.com/all' info_list=parse_page1(start_url,info_list) # range()包頭不包尾` for i in range(1,4):#range(4,1,-1),-1表示順序遞減 url = 'https://www.qidian.com/all?orderId=&style=1&pageSize=20&siteid=1&pubflag=0&hiddenField=0&page=' + str(i) info_list = parse_page1(url, info_list) #輸出目標網址 cnt=0 for i in info_list: cnt=cnt+1 i='https:'+i print(i) #輸出網址數量 print("一共有"+str(cnt)+"條數據") # x_list存的是目標信息,從目標信息所在的網址爬出需要的目標信息 x_list=[] for i in info_list: x_list=parse_page2(i,x_list) #輸出目標信息 for i in x_list: print(i) #如果爬的數量比較多,要等久一會才有輸出