Python 三种网页抓取方法

摘要:本文讲的是利用Python实现网页数据抓取的三种方法;分别为正则表达式(re)、BeautifulSoup模块和lxml模块。本文所有代码均是在python3.5中运行的。

 本文抓取的是[中央气象台](http://www.nmc.cn/)首页头条信息:

这里写图片描述
其HTML层次结构为:
这里写图片描述
抓取其中href、title和标签的内容。

一、正则表达式
copy outerHTML:

<a target="_blank" href="/publish/country/warning/megatemperature.html" title="中央气象台7月13日18时继续发布高温橙色预警">高温预警</a>

代码:

# coding=utf-8
import  re, urllib.request

url = 'http://www.nmc.cn'
html = urllib.request.urlopen(url).read()
html = html.decode('utf-8')     #python3版本中需要加入
links = re.findall('<a target="_blank" href="(.+?)" title',html)
titles = re.findall('<a target="_blank" .+? title="(.+?)">',html)
tags = re.findall('<a target="_blank" .+? title=.+?>(.+?)</a>',html)
for link,title,tag in zip(links,titles,tags):
    print(tag,url+link,title)

正则表达式符号’.’表示匹配任何字符串(除\n之外);‘+’表示匹配0次或者多次前面出现的正则表达式;‘?’表示匹配0次或者1次前面出现的正则表达式。更多内容可以参考Python中的正则表达式教程
输出结果如下:

高温预警 http://www.nmc.cn/publish/country/warning/megatemperature.html 中央气象台71318时继续发布高温橙色预警
山洪灾害气象预警 http://www.nmc.cn/publish/mountainflood.html 水利部和中国气象局71318时联合发布山洪灾害气象预警
强对流天气预警 http://www.nmc.cn/publish/country/warning/strong_convection.html 中央气象台71318时继续发布强对流天气蓝色预警
地质灾害气象风险预警 http://www.nmc.cn/publish/geohazard.html 国土资源部与中国气象局71318时联合发布地质灾害气象风险预警

二、BeautifulSoup 模块
Beautiful Soup是一个非常流行的Python模块。该模块可以解析网页,并提供定位内容的便捷接口。
copy selector:

#alarmtip > ul > li.waring > a:nth-child(1)

因为这里我们抓取的是多个数据,不单单是第一条,所以需要改成:

#alarmtip > ul > li.waring > a

代码:

from bs4 import BeautifulSoup
import urllib.request

url = 'http://www.nmc.cn'
html = urllib.request.urlopen(url).read()
soup = BeautifulSoup(html,'lxml')
content = soup.select('#alarmtip > ul > li.waring > a')

for n in content:
    link = n.get('href')
    title = n.get('title')
    tag = n.text
    print(tag, url + link, title)

输出结果同上。

三、lxml 模块
Lxml是基于libxml2这一XML解析库的Python封装。该模块使用C语言编写,解析速度比Beautiful Soup更快,不过安装过程也更为复杂。
代码:

import urllib.request,lxml.html

url = 'http://www.nmc.cn'
html = urllib.request.urlopen(url).read()
tree = lxml.html.fromstring(html)
content = tree.cssselect('li.waring > a')

for n in content:
    link = n.get('href')
    title = n.get('title')
    tag = n.text
    print(tag, url + link, title)

输出结果同上。

四、将抓取的数据存储到列表或者字典中
以BeautifulSoup 模块为例:

from bs4 import BeautifulSoup
import urllib.request

url = 'http://www.nmc.cn'
html = urllib.request.urlopen(url).read()
soup = BeautifulSoup(html,'lxml')
content = soup.select('#alarmtip > ul > li.waring > a')

######### 添加到列表中
link = []
title = []
tag = []
for n in content:
    link.append(url+n.get('href'))
    title.append(n.get('title'))
    tag.append(n.text)

######## 添加到字典中
for n in content:
    data = {
        'tag'   : n.text,
        'link'  : url+n.get('href'),
        'title' : n.get('title')
    }

五、总结
表2.1总结了每种抓取方法的优缺点。
这里写图片描述

源代码链接

参考文献:
《用Python写网络爬虫》——2.2 三种网页抓取方法

  • 9
    点赞
  • 73
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Python爬虫是一种用于自动化获取网页数据的程序。它可以通过发送HTTP请求,解析HTML页面,并提取所需的信息。对于静态网页,爬虫可以直接通过请求获取到页面的HTML代码,然后使用解析库(如BeautifulSoup)来提取所需的数据。但是对于动态网页,情况稍有不同。 动态网页是指在页面加载过程中,通过JavaScript等技术动态生成内容的网页。这些内容可能是通过Ajax请求获取的,或者是在页面加载完成后通过JavaScript代码生成的。因此,对于动态网页抓取,我们需要模拟浏览器行为来执行JavaScript代码,并获取最终生成的HTML内容。 在Python中,有一些库可以帮助我们实现动态网页抓取,其中比较常用的是Selenium和Pyppeteer。这两个库都可以模拟浏览器行为,并且支持执行JavaScript代码。你可以根据自己的需求选择其中一个进行使用。 使用Selenium进行动态网页抓取的基本步骤如下: 1. 安装Selenium库:使用pip命令安装selenium库。 2. 下载浏览器驱动:根据你使用的浏览器(如Chrome、Firefox等)下载对应的浏览器驱动,并将其添加到系统路径中。 3. 创建WebDriver对象:使用Selenium的WebDriver类创建一个浏览器对象,如ChromeDriver。 4. 打开网页:使用WebDriver对象的get方法打开目标网页。 5. 执行JavaScript代码:如果页面中有动态生成的内容,可以使用WebDriver对象的execute_script方法执行JavaScript代码。 6. 提取数据:使用Selenium提供的方法或者其他解析库(如BeautifulSoup)来提取所需的数据。 使用Pyppeteer进行动态网页抓取的基本步骤如下: 1. 安装Pyppeteer库:使用pip命令安装pyppeteer库。 2. 安装Chromium浏览器:Pyppeteer依赖于Chromium浏览器,需要先安装Chromium浏览器。 3. 创建Browser对象:使用Pyppeteer的launch方法创建一个浏览器对象。 4. 创建Page对象:使用Browser对象的newPage方法创建一个页面对象。 5. 打开网页:使用Page对象的goto方法打开目标网页。 6. 执行JavaScript代码:如果页面中有动态生成的内容,可以使用Page对象的evaluate方法执行JavaScript代码。 7. 提取数据:使用Pyppeteer提供的方法或其他解析库(如BeautifulSoup)来提取所需的数据。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值