Python-爬取HTML网页数据

Python-爬取HTML网页数据Python-爬取HTML网页数据软件环境Mac10.13.1(17B1003)Python2.7.10VSCode1.18.1摘要本文是练手Demo,主要是使用BeautifulSoup来爬取网页数据。BeautifulSoup介绍BeautifulSoup提供一些简单的、python式的用来处理导航、搜索、修改分析树等功能。BeautifulSoup官方

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

Python-爬取HTML网页数据

软件环境

  • Mac 10.13.1 (17B1003)
  • Python 2.7.10
  • VSCode 1.18.1

摘要

本文是练手Demo,主要是使用 Beautiful Soup 来爬取网页数据。

Beautiful Soup 介绍

Beautiful Soup提供一些简单的、python式的用来处理导航、搜索、修改分析树等功能。

Beautiful Soup 官方中文文档

特点

  • 简单:它是一个工具箱,通过解析文档为用户提供需要抓取的数据
  • Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。

Beautiful Soup 的安装

  • 安装 pip (如果需要): sudo easy_install pip
  • 安装 Beautiful Soup: sudo pip install beautifulsoup4

示例

确定获取数据范围

本示例是获取项目列表,打开Chrome的调试栏,找到对应的位置,如下图:
Chrome确定爬取位置

导包

import sys
import json
import urllib2 as HttpUtils
import urllib as UrlUtils
from bs4 import BeautifulSoup 

获取页面信息(分页)

def gethtml(page):
    '获取指定页码的网页数据'
    url = 'https://box.xxx.com/Project/List'
    values = { 
   
        'category': '',
        'rate': '',
        'range': '',
        'page': page
    }
    data = UrlUtils.urlencode(values)
    # 使用 DebugLog
    httphandler = HttpUtils.HTTPHandler(debuglevel=1)
    httpshandler = HttpUtils.HTTPSHandler(debuglevel=1)
    opener = HttpUtils.build_opener(httphandler, httpshandler)
    HttpUtils.install_opener(opener)
    request = HttpUtils.Request(url + '?' + data)
    request.get_method = lambda: 'GET'
    try:
        response = HttpUtils.urlopen(request, timeout=10)
    except HttpUtils.URLError, err:
        if hasattr(err, 'code'):
            print err.code
        if hasattr(err, 'reason'):
            print err.reason
        return None
    else:
        print '====== Http request OK ======'
    return response.read().decode('utf-8')
TIPS
  • urlopen(url, data, timeout)
    • url: 请求的 URL
    • data: 访问 URL 时要传送的数据
    • timeout: 超时时间
  • HttpUtils.build_opener(httphandler, httpshandler)
    • 开启日志,将会在调试控制台输出网络请求日志,方便调试
  • 必要的 try-catch,以便可以捕获到网络异常

解析获取的数据

创建BeautifulSoup对象

soup = BeautifulSoup(html, 'html.parser')

获取待遍历的对象

# items 是一个 <listiterator object at 0x10a4b9950> 对象,不是一个list,但是可以循环遍历所有子节点。
items = soup.find(attrs={ 
   'class':'row'}).children

遍历子节点,解析并获取所需参数

projectList = []
for item in items:
    if item == '\n': continue
    # 获取需要的数据
    title = item.find(attrs={ 
   'class': 'title'}).string.strip()
    projectId = item.find(attrs={ 
   'class': 'subtitle'}).string.strip()
    projectType = item.find(attrs={ 
   'class': 'invest-item-subtitle'}).span.string
    percent = item.find(attrs={ 
   'class': 'percent'})
    state = 'Open'
    if percent is None: # 融资已完成
        percent = '100%'
        state = 'Finished'
        totalAmount = item.find(attrs={ 
   'class': 'project-info'}).span.string.strip()
        investedAmount = totalAmount
    else:
        percent = percent.string.strip()
        state = 'Open'
        decimalList = item.find(attrs={ 
   'class': 'decimal-wrap'}).find_all(attrs={ 
   'class': 'decimal'})
        totalAmount =  decimalList[0].string
        investedAmount = decimalList[1].string
    investState = item.find(attrs={ 
   'class': 'invest-item-type'})
    if investState != None:
        state = investState.string
    profitSpan = item.find(attrs={ 
   'class': 'invest-item-rate'}).find(attrs={ 
   'class': 'invest-item-profit'})
    profit1 = profitSpan.next.strip()
    profit2 = profitSpan.em.string.strip()
    profit = profit1 + profit2
    term = item.find(attrs={ 
   'class': 'invest-item-maturity'}).find(attrs={ 
   'class': 'invest-item-profit'}).string.strip()
    project = { 
   
        'title': title,
        'projectId': projectId,
        'type': projectType,
        'percent': percent,
        'totalAmount': totalAmount,
        'investedAmount': investedAmount,
        'profit': profit,
        'term': term,
        'state': state
    }
    projectList.append(project)

输出解析结果,如下:

解析结果

TIPS
  • 解析html代码,主要是运用了BeautifulSoup的几大对象,TagNavigableStringBeautifulSoupComment,可以参考Beautiful Soup 官方中文文档

本文参考:
  • https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html
  • http://www.jianshu.com/p/972c95610fdc
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/193774.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • mac navicat激活码【2021免费激活】

    (mac navicat激活码)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~MLZPB5EL5Q-eyJsaWNlb…

    2022年3月21日
    68
  • 数据预处理无量纲化处理_统计数据的预处理

    数据预处理无量纲化处理_统计数据的预处理1.无量纲化定义无量纲化,也称为数据的规范化,是指不同指标之间由于存在量纲不同致其不具可比性,故首先需将指标进行无量纲化,消除量纲影响后再进行接下来的分析。2.无量纲化方法无量纲化方法有很多,但

    2022年8月5日
    10
  • Docker教程(超全总结)[通俗易懂]

    Docker教程(超全总结)[通俗易懂]Docker基础+进阶总结,让你一文读懂Docker

    2022年10月15日
    4
  • 记一次不在状态的大疆面试

    记一次不在状态的大疆面试之前写博客也有不少,但一直没有一个固定的地方,csdn,博客园,eoe,oschina都写过一些,但没有长期固定的去记录,自己开的博客站也因为忘记续费而被停掉,数据也丢了…希望在简书能坚持记录一些技术上的东西,刚好昨天在大疆面试完,就以大疆作为简书博客的开端吧11月初有前同事内推大疆Android开发的机会,就发了一份简历过去试试。大概一个星期,收到了…

    2022年6月22日
    34
  • EXCUTE方法executeUpdate「建议收藏」

    EXCUTE方法executeUpdate「建议收藏」“Execute”是JAVA语言的一种,作用是执行动态的SQL语句或非运行时创建的PL/SQL块,动态创建和执行SQL语句。Execute语句的方法1方法executeQuery用于产生单个结果集的语句,例如SELECT语句。被使用最多的执行SQL语句的方法是executeQuery。这个方法被用来执行SELECT语句,它几乎是使用最多的SQL语句。2方法executeUp…

    2022年10月20日
    5
  • mysql索引是什么 优点和缺点_MySQL索引优缺点、使用原则及种类介绍「建议收藏」

    mysql索引是什么 优点和缺点_MySQL索引优缺点、使用原则及种类介绍「建议收藏」一、索引简介1、索引简介索引(Index)是帮助MySQL高效获取数据的数据结构。在MySQL中,索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的。MyISAM和InnoDB存储引擎只支持BTREE索引,MEMORY/HEAP存储引擎支持HASH和BTREE索引。2、索引的优点A、提高数据检索效率,降低数据库的IO成本。B、通过索引对数据进行排序,降低数据排序的成本降低了CPU的消…

    2022年5月26日
    43

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号