zoukankan      html  css  js  c++  java
  • 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)
    #如果爬的数量比较多,要等久一会才有输出
  • 相关阅读:
    逆向工程工具介绍2-IDA
    汇编语言基础-1 基本语言元素
    Python常用标准库1-Turtle,Random,Time和Datetime
    Python的模块、包和库的概念
    Go语言的函数修饰符
    物理层2-物理层下面的传输媒体
    数据分析之两种用户分群方法(RFM和聚类)
    区间估计与假设检验公式
    源码分析过滤器与拦截器的区别
    Springboot拦截器使用及其底层源码剖析
  • 原文地址:https://www.cnblogs.com/-citywall123/p/11172059.html
Copyright © 2011-2022 走看看