Python抓取HTML

本文详细介绍了网页抓取的基本步骤,包括抓取HTML字符串的方法、GET与HEAD请求的区别及应用,以及POST请求的具体实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一. 抓取网页的三个步骤(个人表面的理解)


1. 抓取HTML字符串.

2. 分析HTML字符串.

3. 对分析结果做自己想做的处理.

4. 你也可以做一些其他事情例如定时请求(POST, GET)


二. 抓取HTML字符串


1. 方法1

#!/usr/bin/env python
# Python 2.7.3
# A001_Get_HTML.py
# 检查抓取网页的HTML文本并显示
import urllib2
response = urllib2.urlopen('http://www.baidu.com/')
htmlStr = response.read()
print(htmlStr)


2. 方法2

#!/usr/bin/env python
# Python 2.7.3
# A001_Get_HTML.py
# 检查抓取网页的HTML文本并显示
import urllib2  
req = urllib2.Request('http://www.baidu.com')# Request也可以
response = urllib2.urlopen(req)  
htmlStr = response.read()  
print(htmlStr)


3. GET 方法

www.baidu.com网页中的搜索框中输入"你好", 按一下"百度一下"按钮后产生如下网址:

http://www.baidu.com/s?wd=%E4%BD%A0%E5%A5%BD&rsv_bp=0&rsv_spt=3&ie=utf-8&rsv_sug3=5&rsv_sug=0&rsv_sug1=5&rsv_sug4=373&inputT=7634

浏览器界面就会显示"你好"的相关搜索结果.

现在使用Python来模式:

#!/usr/bin/env python
# Python 2.7.3
# A003_Get_HTML.py
# 检查抓取网页的HTML文本并显示
import httplib
conn = httplib.HTTPConnection("www.baidu.com")
# 看这里是怎么生成Get数据的
conn.request("GET", "/s?wd=%E4%BD%A0%E5%A5%BD&rsv_bp=0&rsv_spt=3&ie=utf-8&rsv_sug3=5&rsv_sug=0&rsv_sug1=5&rsv_sug4=373&inputT=7634") 
# http://www.baidu.com后面的数据都是GET请求的数据.
r1 = conn.getresponse()# 获得响应的HTML
print(r1.status)# 打印结果
print(r1.reason)
data1 = r1.read()# 获得HTML
f = open('index.html', 'w')# 写入文件(你使用浏览器打开这个文件看看)
f.write(data1)
f.close()

4.  HEAD方法

HEAD方法获取的是请求的url资源的相应报头信息

#!/usr/bin/env python
# Python 2.7.3
# A003_Get_HTML.py
# 检查抓取网页的HTML文本并显示
import httplib
conn = httplib.HTTPConnection("www.python.org")
conn.request("HEAD", "/index.html") 
# HEAD方法获取的是请求的url资源的相应报头信息
r1 = conn.getresponse()# 获得响应的HTML
print(r1.status)# 打印结果
print(r1.reason)
data1 = r1.read()# HEAD方法不能获得HTML
f = open('index.html', 'w')# 写入文件(你使用浏览器打开这个文件看看)
f.write(data1)
f.close()

三. POST方法

1. 首先你要找一个有POST请求的网页.


如果你自己配置了一个Web服务器也可以自己写一个.(我自己不熟悉HTMLWeb, 所以在网上找了一个)

http://www.python.org/index.html

如下图:


图1

它的HTML是这样的:

           <form method="POST" action="/3kpoll">
             <p><input type="text" class="input-text" name="pkg" /></p>
             <p>(enter <a href="http://pypi.python.org/pypi">PyPI package name</a>)</p>
             <p>
               <input type="submit" value="Vote" />
               <a href="/3kpoll">Results</a>
             </p>
           </form>

2. 使用Python模拟这个POST.

根据1中的说明如下代码:

2.1 方法一

(这个方法HTTP监控工具可以监控出来(Fidder Web Debugger))

#!/usr/bin/env python
# Python 2.7.3
# A005_Get_HTML.py
import urllib2,urllib,sys
url = "http://www.python.org/3kpoll"# URL
search = urllib.urlencode([('pkg','ddd')])# POST的数据对
req = urllib2.Request(url)# 建立连接
fd = urllib2.urlopen(req, search)# POST数据
while 1:# 读取响应
    data = fd.read(1024)
    if not len(data):
        break
sys.stdout.write(data)

网站返回:

The package ddd does not exist. Please verify the package name


2.2 方法二

(这个方法HTTP工具没有监控出来(Fidder Web Debugger))

#!/usr/bin/env python
# Python 2.7.3
# A006_Get_HTML.py
import urllib2, urllib, sys
import httplib
url = "http://www.python.org/3kpoll"# URL
params = urllib.urlencode([('pkg','ddd')])# POST的数据对
# 如果有多个数据要POSt可以这样写
#params = urllib.urlencode({'programe': 'python', 'age': 12})# POST的数据对
# 这里是固定的写法(headers还有很多key/value对, 没写的就使用Python默认的)
headers = {"Content-type": "application/x-www-form-urlencoded" , "Accept": "text/plain"}
httpClient = httplib.HTTPConnection("www.python.org", 80, timeout=30)
# 这样也可以
# httpClient = httplib.HTTPConnection("www.python.org:80")
httpClient.request("POST", "/3kpoll", params, headers)
response = httpClient.getresponse()
print(response.status)
print(response.reason)
print(response.read())
print(response.getheaders()) #获取头信息


2.3 方法三


#!/usr/bin/env python
# Python 2.7.3
# A007_Get_HTML.py
import urllib    
import urllib2
url = "http://www.python.org/3kpoll"# URL
params = urllib.urlencode([('pkg','ddd')])# POST的数据对
# 如果有多个数据要POSt可以这样写
# params = urllib.urlencode({'programe': 'python', 'age': 12})
req = urllib2.Request(url, params)  # 发送请求同时传params表单  
response = urllib2.urlopen(req)  # 接受响应的信息 
 
print(response.read())


2.4 方法四 模拟成IE发送

#!/usr/bin/env python
# Python 2.7.3
# A008_Get_HTML.py
# 模拟成IE
import urllib    
import urllib2
url = "http://www.python.org/3kpoll"# URL
# 这里模拟成IE
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'    
headers = { 'User-Agent' : user_agent }    
params = urllib.urlencode([('pkg','ddd')])# POST的数据对
# 如果有多个数据要POSt可以这样写
# params = urllib.urlencode({'programe': 'python', 'age': 12})
req = urllib2.Request(url, params, headers)  # 发送请求同时传params表单  
response = urllib2.urlopen(req)  # 接受响应的信息 
 
print(response.read())

怎样生成这些POST数据需要根据具体点站点的Form?

### 回答1: Python可以使用BeautifulSoup库来抓取HTML中的table数据。以下是一个简单的示例代码: ```python from bs4 import BeautifulSoup import requests url = 'http://example.com' response = requests.get(url) soup = BeautifulSoup(response.text, 'html.parser') table = soup.find('table') rows = table.find_all('tr') for row in rows: cells = row.find_all('td') for cell in cells: print(cell.text) ``` 这个代码会从指定的URL中获取HTML内容,然后使用BeautifulSoup库来解析HTML。它会找到第一个table元素,并遍历其中的所有行和单元格,打印出每个单元格的文本内容。你可以根据自己的需求修改代码来获取不同的数据。 ### 回答2: Python 是一种广泛应用于数据处理、网络爬虫等领域的编程语言,在实现数据抓取时也有很强的实用性。如果需要从 HTML 文档中抓取表格数据,可以使用 Python 中的 BeautifulSoup 库和 pandas 库进行处理。 首先需要安装 BeautifulSoup 和 pandas 库,可以使用 pip 进行安装。安装完成后,需要从 HTML 文档中读取页面内容并转化为 BeautifulSoup 对象,代码如下: ``` import requests from bs4 import BeautifulSoup # 请求页面,并将页面内容转化为 BeautifulSoup 对象 url = 'http://www.example.com' response = requests.get(url) soup = BeautifulSoup(response.content, 'html.parser') ``` 通过 soup 对象就可以使用各种 BeautifulSoup 提供的方法对 HTML 文档进行解析和处理。对于表格数据,可以先通过 find 方法找到 table 标签,然后通过 find_all 方法找到其中的所有 tr 和 td 标签,将它们封装成一个嵌套列表: ``` data = [] table = soup.find('table') rows = table.find_all('tr') for row in rows: cells = row.find_all('td') row_data = [] for cell in cells: row_data.append(cell.text) data.append(row_data) ``` 如果需要使用 pandas 进行数据处理,可以将嵌套列表转化成 DataFrame 对象: ``` import pandas as pd df = pd.DataFrame(data) ``` 这样就可以使用 pandas 提供的各种方法对表格数据进行分析和处理了。总的来说,Python 抓取 HTML 中的表格数据主要有两个基本步骤:使用 BeautifulSoup 对象解析 HTML 文档,找到 table 标签并解析其中的 tr 和 td 标签构造成嵌套列表,然后使用 pandas 将嵌套列表转化为 DataFrame 对象进行数据处理。 ### 回答3: Python是一种高级编程语言,具有良好的可读性和易于学习的特点,因此越来越受到网络爬虫和数据提取方面程序员们的青睐。本文将简要介绍如何使用Python编写程序抓取HTML中table数据。 一、http请求 首先需要使用Python中的requests库进行http请求,获取到网站的html代码。我们可以使用get请求获取到网站的html代码,如下所示: ```python import requests url = 'http://www.example.com' response = requests.get(url) html = response.text ``` 如果需要传递参数,我们可以使用params参数: ```python params = {'search': 'iphone'} response = requests.get(url, params=params) ``` 二、解析html 获取html代码后,我们需要使用Python中的解析库将其解析为可操作的数据结构。Python中常见的解析库有:BeautifulSoup、lxml等。本文将使用BeautifulSoup解析库,需要使用以下命令进行安装: ```python pip install beautifulsoup4 ``` 小技巧:在解析html代码时,我们可以使用lxml库进行解析,速度比BeautifulSoup更快。但是在实际应用中,最好同时安装两个库,进行快速切换。 使用BeautifulSoup进行解析: ```python from bs4 import BeautifulSoup soup = BeautifulSoup(html, 'html.parser') ``` 三、查找和拆分table数据 获取到解析后的数据后,可以使用find_all进行table标签的查找,如下所示: ```python table = soup.find_all('table') ``` 获取到table数据后,我们可以将其拆分为行数据和列数据,如下所示: ```python rows = table[0].find_all('tr') for row in rows: cols = row.find_all('td') for col in cols: data = col.contents[0] if col.contents else '' ``` 其中,cols是每行的列,可以使用该列的contents属性获取每个单元格的具体数据。需要注意的是,contents属性返回一个列表,因此需要进行判断,取得其中的第0个元素。最后,我们可将所有的数据存放到列表中,方便后续的数据处理。 综上所述,使用Python抓取HTML中table数据需要完成如下三个步骤:建立http请求,解析HTML代码,查找和拆分table数据。如果能够熟练掌握这些步骤,相信可以快速地实现对HTML中table数据的抓取
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值