江苏开放大学数据采集与预处理第一次作业证券之星数据爬取

注意:因为学习平台题目是随机,选择题选项也是随机,一定注意答案对应的选项,同学们在本页按“Ctrl+F”快捷搜索题目中“关键字”就可以快速定位题目,还是不懂的话可以看这个:快速答题技巧

 爬取证券之星数据

  一、实验目的

掌握使用urllib库访问目标网址,BeautifulSoup库解析网页,获得网页静态加载的数据信息的方法。

  二、实验内容

创建一个爬虫项目StockStar,用于爬取证券之星的部分信息,主要包括代码、简称、流通市值(万元)、总市值(万元)、流通股本(万元)、总股本(万元),http://quote.stockstar.com/stock/ranklist_a.shtml,具体要求如下:

1. 使用urllib库、requests库访问网站,使用bs4库、lxml库解析网页。

2. 获取数据后,用NumPy库、Pandas库将其格式化为DataFrame

3. 用Python3自带的sqlite3库,将数据本地存储在数据库中。

4. 从数据库中读取数据并创建为DataFrame,再打印数据作为展示。

  三、作业提交要求

完成实验报告(见附件模板),将源代码和实验报告一起压缩打包提交至学习平台。

解析网页

from bs4 import BeautifulSoup
import urllib


# 需要解析的目标地址
url = 'http://quote.stockstar.com/stock/ranklist_a_3_1_1.html'

# 访问目标地址
response = urllib.request.urlopen(url, timeout=60).read()

# 解析网页
soup = BeautifulSoup(response, 'html5lib', from_encoding='gb2312')
代码释义:

1.urllib.request.urlopen()函数实现对目标地址的访问

函数原型为:urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)

其中,需要了解的有:

url:需要打开的网址

data:Post提交的数据

timeout:设置网站的访问超时时间

2.BeautifulSoup()函数实现对网页的解析

传入BeautifulSoup()一般需要3个参数:文档、解析器、编码方式。

将一段文档传入BeautifulSoup的构造方法,BeautifulSoup会将其解析,就能得到一个文档的对象, 可以传入一段字符串或一个文件句柄。

解析器可以自己选用,这里选用的是"html5lib",主要的解析器及其优缺点如下图所示:

推荐使用lxml和html5lib。另外,如果一段HTML或XML文档格式不正确,那么在不同解析器中返回的结果可能不一样,具体可以查看解析器之间的区别。

同时,urllib库可以用requests库替换,bs4库可以用lxml库替换,具体使用方法如下:

from lxml import etree
import requests


# 需要解析的目标地址
url = 'http://quote.stockstar.com/stock/ranklist_a_3_1_1.html'

# 访问目标地址
respond = requests.get(url).text

# 解析网页
tree = etree.HTML(respond)
代码释义:

1.requests.get()函数发送一个GET请求

函数原型为:requests.get(url, params=None, **kwargs) 

其中,需要了解的有:

url:需要发送Request的对象地址

params:(可选)以字典形式传递参数

2.etree.HTML()从字符串中以树的结构解析HTML文档,返回解析后的根节点。

函数原型为:HTML(text, parser=None, base_url=None)

其中,需要了解的有:

text:需要解析成HTML文档的字符串

parser:传入参数以使用不同的HTML解析器

base_url:网站根地址,用于处理网页资源的相对路径

以上两种方式分别使用了urllib库→bs4库和requests库→lxml库。虽然使用的库不同,但是步骤都是先访问网页并获取网页文本文档(urllib库、requests库),再将其传入解析器(bs4库、lxml库)。值得一提的是,这两个例子中的搭配可以互换。

url = 'http://quote.stockstar.com/stock/ranklist_a_3_1_1.html'

response = urllib.request.urlopen(url, timeout=60).read()
tree = etree.HTML(response)

respond = requests.get(url).text
soup = BeautifulSoup(respond, 'html5lib')

如上所示:urllib库→lxml库和requests库→bs4库这样的方式也是可行的。

在目前的需求下,urllib库和requests库的差距体现不大,但是实际上二者还是有如下区别:

构建参数
urllib库在请求参数时需要用urlencode()对参数进行编码预编译,而requests库只需要把参数传入get()中的params中

请求数据
urllib库需要拼接一个url字符串,而requests库只需要将get()中的base_url填写完善即可

连接方式
urllib库每次请求结束关闭socket通道,而requests库多次重复使用一个socket,消耗更少资源

编码方式
requests库的编码方式更加完备

bs4库和lxml库的对比
一提到网页解析技术,提到最多的关键字就是BeautifulSoup和xpath,而它们各自在Python中的模块分别就是bs4库和lxml库。以下是它们的区别:

效率
一般来说,xpath的效率优于BeautifulSoup。BeautifulSoup是基于DOM的,会载入整个文档,解析整个DOM树,因此时间和内存开销都会大很多。进行分步调试时,生成soup对象时会有明显的延迟。lxml.etree.HTML(html)在step over的一瞬间便成功构建了一个可执行xpath操作的对象。并且lxml库只会进行局部遍历。

难度
个人认为bs4库比lxml库更容易上手。一方面是使用门槛,BeautifulSoup中的各种方法,看了文档就能用;而lxml需要通晓xpath语法,这意味着需要同时学习xpath语法和查询API文档。另一方面是返回结果,lxml中的xpath()方法返回对象始终是一个list,处理起来比较尴尬;而BeautifulSoup中的方法相对灵活,适合不同场合。

适用场合
这里主要提一下使用禁区。当遇到list嵌套list的时候,尽量不选择BeautifulSoup而使用xpath,因为BeautifulSoup会用到2个find_all(),而xpath会省下不少功夫。当遇到所需获取的类名有公共部分时,可以使用BeautifulSoup而非xpath,因为xpath需要完全匹配,也就是除了公共部分之外各自独有的部分也得匹配,这样就需要多行代码来获取,而BeautifulSoup可以仅匹配公共部分就获取所有匹配上的类。

3.2 获取数据
在本案例中,所有由bs4库获取的内容都可以用同样的逻辑思路用lxml库获取,因此将用bs4库先作演示如何获取内容,再直接根据bs4库提到的标签,直接写出lxml库的代码。

江苏开放大学数据采集与预处理第一次作业证券之星数据爬取

通过查看网页源码可以看到,该网页并没有使用常见的”utf-8″编码,而使用了”gb2312″编码。

更多原文:Python证券之星数据爬取

本页面参考范文仅供参考,转转请注明出处:https://www.xingkaowang.com/9693.html

本文意在促进知识的共享与交流,提高公众对相关领域的认知和理解。

(0)
上一篇 2023年8月22日 下午7:58
下一篇 2023年8月22日 下午7:37

相关推荐

发表回复

登录后才能评论
联系我们

邮件:xingkaowang@163.com

QQ:994370779

工作时间:周一至周五,9:30-17:30,节假日休息

人工解题

人工解题

会员学期新增题免费解答

年费享实践作业、小论文定制

可单独实践报告、小论文定制

解题QQ:994370779

售后反馈
微信公众号
微信公众号
分享本页
返回顶部