相关学习知识
有些情况下,网页内容可能是动态生成的,此时网页的源代码并不对应网页所显示的内容。比如:股票数据信息,其数据经常在变化。
网络数据如何获取(爬取)?=抓取网页内容,解析网页内容
一、抓取理论知识
1、定义:客户机发送一个请求requests给服务器,服务器会返回一个响应response。
Urllib 内建模型—urllib.request—方便抓取网页内容
Requests第三方库—很适合中小型的的网络爬虫开发
Requests库是更简单、方便和人性化的Python HTTP第三方库
Requests官网—可以多查阅、多使用
图片相关解析
1、r=requests.get(网址)
2、r.status_code查看状态码,200表示正常
【在实战中出现418错误,要根据不同的浏览器把headers放入代码中。不同浏览器的方法不同,使用Chrome浏览器较为特殊。网络上可查阅相关方法。】
3、r.text查看网页内容,print(r.text)输出内容排版更好
在抓取一个网站的内容之前,要看一看这个网站是否具有爬虫协议https://book.douban.com/robots.txt(robots表示有自己的爬虫协议,里面写着哪些可以获取,哪些不能获取)
view-source:https://book.douban.com/subject/34907855/?icn=index-topchart-subject(我们获取的subject这个目录,没有被禁止,表示可以抓取)
2、对于有些动态网页,其源代码中很多我们想要的数据并不是直接通过抓取URL获得的,而是用js动态生成。而有些数据也是比较容易获得的,我们可以寻找一些非动态生成的页面进行抓取,或者利用API进行数据的获取、利用现成的数据集或者在网上直接保存的数据。
二、抓取实战内容
豆瓣影评为例
用Anaconda进行实践,代码如下:
import requests
r=requests.get('https://book.douban.com/subject/34907855/comments/')
headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'}
r=requests.get('https://book.douban.com/subject/34907855/comments/',headers=headers)
r.status_code
print(r.text)
道指成分股数据
re=requests.get('http://money.cnn.com/data/dow')
print(re.text)
requests会自动解码来自服务器的信息
re.json() 可用于解码网页是Json格式
re.content 可用于解码内容是二进制的,如返回一个二进制创建的图片
re.text 可以自动推测文本编码并进行解码
re.encoding 可以修改文本的编码,常用的是 utf-8
三、解析理论知识
1、定义:对来自服务器的响应response进行解析,解析我们所抓取到的网页内容。
(1)BeautifulSoup库,一个可以从HTML或者XML文件中提取数据的Python库。是HTML和XML的解析器。
官网:
选择解析器,我们对于HTML最常用的解析器就是LXML,速度较快,却文档的容错能力比较强。
(2)Re模块,正则表达式模块进行各类正则表达式处理。通常指用来检索替换符合某个规则或者模块的文本
官网:
**<span class="short"> …… **</span>**
这种简单形式的内容非常适合Beautifulsoup库。
<span class="user-stars allstar50 rating" title="力荐"></span>
细节较为复杂的数据的提取适合Re模块。
四、解析实战内容
BeautifulSoup的使用
BeautifulSoup对象有四种:
1、Tag是HTML或者XML文档中的标签 。
Tag最重要的属性包括name和attribute。
> <p class="title"><b>The Little Prince</b></p>'
2、NavigableString就是tag当中的字符串,例如上述代码中的:The Little Prince
3、BeautifulSoup本身就是tag的内容
4、Comment就是NavigableString的一个子类
#直接导入库
from bs4 import BeautifulSoup
#定义一个字符串
markup = '<p class="title"><b>The Little Prince</b></p>'
#利用BeautifulSoup()函数传入这个字符串
soup = BeautifulSoup(markup,"lxml")
#生成一个BeautifulSoup对象Soup,其对象有四种: Tag/NavigableString/BeautifulSoup/Comment
soup.b
#soup.b的类型
type(soup.b)
#Tag最重要的属性包括name和attribute,每个Tag通过name属性可以获得自己的名字
tag=soup.p
tag.name
#获得Tag相应的属性
tag.attrs
#获取Tag当中非属性的字符串
tag.string
#通过这个方法可寻找多所有b标签的内容,除了使用标签作为参数外,还可以带上属性名。
soup.find_all('b')
代码解释:
1、把之前获取到的数据传入到BeautifulSoup()函数中,获得一个BeautifulSoup对象soup
2、 通过find_all()方法寻找评论所在的行。评论行的内容是标签span,属性内容是short。 find_all()方法返回的是一个列表。
3、遍历列表,对于每一个项在这个列表当中,只要输出这个对象的string属性,便可以获得字符串。
re模块的使用
获取评分
假设我们要寻找的是<span class="user-stars allstar40 rating" title="推荐"></span>
通过compile方法把这个字符串编译成一个pattern实例。
完整版代码见Anaconda