本文为南大《用Python玩转数据》学习笔记
用到的库或模块:
1.Requests第三方库
用于中小型网络爬虫的信息抓取。
基本方法:
requests.get() 请求获取指定YRL位置的资源,对应HTTP协议的GET方法
Requests官网:http://www.python-requests.org/
(可查看基本用法)
2.BeautifulSoup库
是一个可从HTML或XML文件中提取数据的Python库
官网:https://www.crummy.com/software/BeautifulSoup/bs4/doc/
BeautifulSoup在进行解析时,对HTML最常用的解析器是LXML
3.re 正则表达式模块
用来检索替换符合某个规则或者是模块的文本。
1.在对某个网站进行爬虫之前,往往需要查看其爬虫协议,看是否允许爬虫。
查看豆瓣的爬虫协议:
可知所要抓取的subject目录下的东西并没有被禁止。
(该协议的延时Crawl-delay是5秒钟)
2.分析网页源码特征,编写代码
import requests
import re
from bs4 import BeautifulSoup
headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'}
r=requests.get('https://book.douban.com/subject/1084336/comments/',headers=headers)
soup=BeautifulSoup(r.text,'lxml')
pattern=soup.find_all('span','short') #('标签','属性内容')
for item in pattern:
print(item.string) #通过string属性获得字符串
pattern_s=re.compile('<span class="user-stars allstar(.*?)rating"') #通过compile()方法将字符串编译成pattern实例
p=re.findall(pattern_s,r.text) #使用正则表达式中的findall()函数匹配源代码中这样的模式
s=0
for star in p:
s+=int(star)
print(s)
headers里的内容由此查看:
查看网页源码,可知所有的评论都有标签标记:
评论的分值则都有这样的标签:
部分运行结果:
附:
BeautifulSoup基本使用方法:
BeautifulSoup的对象有4种:
(1)Tag:HTML或LXML文档中的标签 (如图中黄框部分),最重要的属性包括name和attribute
(2)NavigableString:Tag中插入的字符串 (如图中椭圆部分)
(3)BeautifulSoup
(4)Comment:NavigableString的子类
本文代码只是对单个网页进行爬取,还可通过各个网页中的url特征来循环抓取多个网页,这样一个小型的爬虫就实现了。