Python网络编程(五)-利用requests和BeautifulSoup进行网络数据抓取和解析

1. BeautifulSoup简介:

在介绍了urllib,urllib3,requests等数据爬取相关的python库后,今天,再介绍一个更为流行的网页数据爬虫库,BeautifulSoup。

BeautifulSoup是有一个非常流行的python库,最主要的功能是从网页抓取数据。
BeautifulSoup可以对抓取的网页中的数据进行分析。BeautifulSoup自动将输入文档转换为Unicode编码,输出文档转换为 utf-8 编码。你几乎不需要考虑编码方式,当然,你也可以指定编码方式。
BeautifulSoup和requests、lxml、html6lib结合,更可以打造强大的数据爬取和解析利器。

2. BeautifulSoup实践:

例子:利用BeautifulSoup和requests对网页进行分析,获取网址和名称。

#获取网站网址和名称,以http://news.163.com/photo/#Current为例。
#http://news.163.com/photo/#Current是网易图片的网站

import requests
from bs4 import BeautifulSoup as bs

#获取网页内容
def get_web_content(url):
	print(url)
	res = requests.get(url) #发送请求
	#print(res.encoding)    #查看网页编码的
	#res.encoding = 'utf-8' #跟上一个(res.encoding)结合来用,如果编码有乱码,则可以通过这个定义编码来改变
	html = res.text     
	#print(html)

	item_list = []
	soup  = bs(html,"html.parser")     #定义一个BeautifulSoup变量
	#items = soup.find_all('div',attrs={'class':'nav-mod-1'})  #span 
	items = soup.find_all('a',attrs={'class':'ntes-nav-index-title ntes-nav-entry-wide c-fl'}) 

	#print(items)

	for item in items:
	    href=item.get('href')
	    title=item.get('title')
	    #print(item)
	    print("网址:" + href)
	    print("名称:" + title)
	    item_list.append(href)
	print('列表数量:%d' % len(item_list))

#main
if __name__ == '__main__':
    #url = 'https://news.sina.com.cn/'
    url = 'http://news.163.com/photo/#Current' #网易图片网址
    get_web_content(url)

代码说明:

soup  = bs(html,"html.parser")     #定义一个BeautifulSoup变量

items = soup.find_all('a',attrs={'class':'ntes-nav-index-title ntes-nav-entry-wide c-fl'})  #获取属性class的值为“ntes-nav-index-title ntes-nav-entry-wide c-fl”的内容,

然后,可以进一步解析。

运行结果:

aaaaa:chaper user1$ python test_soup.py 

http://news.163.com/photo/#Current

网址:https://www.163.com/

名称:网易首页

列表数量:1

原网站内容:

http://news.163.com/photo/#Current,是网易图片网站,html内容(截取部分)如下:

<div class="ntes-nav" id="js_N_nav">
    <div class="ntes-nav-main clearfix">
            <div class="c-fl">
        <a class="ntes-nav-index-title ntes-nav-entry-wide c-fl" href="https://www.163.com/" title="网易首页">网易首页</a>
        <!-- 应用 -->
        <div class="js_N_navSelect ntes-nav-select ntes-nav-select-wide ntes-nav-app  c-fl">
          <a href="http://www.163.com/#f=topnav" class="ntes-nav-select-title ntes-nav-entry-bgblack JS_NTES_LOG_FE">应用
            <em class="ntes-nav-select-arr"></em>
          </a>

其中,ntes-nav-index-title ntes-nav-entry-wide c-fl就是class属性的一个值,可以认为是key。

猜你喜欢

转载自blog.csdn.net/liranke/article/details/113915314