python 嵌套爬取網頁信息


當需要的信息要經過兩個鏈接才能打開的時候,就需要用到嵌套爬取。

比如要爬取起點中文網排行榜的小說簡介,找到榜單網址: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)
#如果爬的數量比較多,要等久一會才有輸出

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM