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
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 05-01-部署 WSUS on Windows 2019 Core

    05-01-部署 WSUS on Windows 2019 Core

  • 关于SetCapture() 和 ReleaseCapture()的用法的个人理解[通俗易懂]

    关于SetCapture() 和 ReleaseCapture()的用法的个人理解[通俗易懂]1.函数功能:在当前线程的指定窗口里设置鼠标捕获。一旦窗口捕获了鼠标,所有鼠标输入都针对该窗口,无论光标是否在窗口的边界内还是边界外。同一时刻只能有一个窗口捕获鼠标。2.失效条件: A.当鼠标在其他窗口按下;B.调用ReleaseCapture释放。3. SetCapture和ReleaseCapture必须成对出现通俗来讲,例如:一只羊被一根弹性的

  • C# -XML用法(XmlDocument )

    C# -XML用法(XmlDocument )使用visualstudio中自带的xml解析器,引入System.Xml命名空间。1.向文件中写入配置xml文件实现效果:&amp;lt;?xmlversion=&quot;1.0&quot;encoding=&quot;utf-8&quot;?&amp;gt;&amp;lt;某某某某公司&amp;gt;&amp;lt;执行董事兼总经理&amp;gt;曾振帅&amp;lt;/执行董事兼总经

  • token实现验证登录(token如何使用)

    1.场景还原可能还有很多小伙伴对token概念朦朦胧胧,今天笔者以项目中的用户登录的token验证需求跟大家讲讲其中的来龙去脉,希望能够理清大伙的思路。2.需求分析这个需求可能早已是老生常谈,但我觉得它永远也不会过时①谷歌浏览器:login.html—->index.html;②然后复制index.html的地址在IE浏览器地址栏上,这时普遍网站都会使访问界面直接

  • keras提供的网络_kubernetes网络

    keras提供的网络_kubernetes网络GoogleNet网络详解与keras实现GoogleNet网络详解与keras实现GoogleNet系列网络的概览Pascal_VOC数据集第一层目录第二层目录第三层目录InceptionV1模块介绍Inception的架构GoogleNet的图片Keras代码实现为了搭建Inception网络我们使用了以下策略整个代码的流程如下实验结果实验结果分析本博客相关引用本

  • 知乎转载_知乎上的文章可以转载吗

    知乎转载_知乎上的文章可以转载吗链接:https://www.zhihu.com/question/22590902/answer/55182189来源:知乎著作权归作者所有,转载请联系作者获得授权。题主的问题是如何白手起家靠一个人赚到100万,我觉得这个是可以做到的,但是要分阶段,不太可能从一个从无经商经验的人突然转变成一个人折腾点东西就能赚百万(多个人一起有可能)。我先把我个人的阶段拆解开来,给你一个直观的感受。…

发表回复

您的电子邮箱地址不会被公开。

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