最基础爬虫——Python requests+bs4爬取UIBE教务处
1.使用工具
1.Python 3.x
2.第三方库 requests,bs4
3.浏览器
2.具体思路
UIBE教务处网站开放程度较高,无反爬虫措施,只需要使用最基础的爬虫手段即可。使用requests库获取网页源码,使用bs4中BeautifulSoup库进行网页解析,定位到目标元素即可。
首先得到教务处网站url为:http://jwc.uibe.edu.cn/
导入两个第三方库:
import requests
from bs4 import BeautifulSoup
然后对该url进行get,向其发起请求,并得到其文本内容,使用BeautifulSoup进行转化。
r = requests.get(r"http://jwc.uibe.edu.cn/")#此处使用原字符串避免产生字符误读
soup = BeautifulSoup(r.text)#soup即为使用BeautifulSoup转化之后的对象
然后我们定位爬取目标所在元素,此例中我们计划爬取首页上的所有重要通知的标题
打开该网页,F12检查,点击左上角的定位标识打开定位模式,再点击第一条重要通知
从右侧的界面源码中我们可以观察到,每一条通知展示在页面ul(class = newsList)元素的每一个li元素中,因此我们先使用find定位该ul元素,然后在该元素中使用find_all找到所有的li元素:
div_newslist = soup.find("ul", class_ = "newsList")#由于class是python关键字,此处需要在class后买你加上下划线
li_lst = div_newslist.find_all("li")#得到的li_lst是一个列表,列表的每一个元素是一个li元素
进一步观察发现通知的标题展示在li中的a标签中,且展示在该标签中的title属性,所以遍历li_lst列表,打印出里面每一个元素中a标签中的title属性:
for li in li_lst:
a = li.find("a")
print(a["title"])#打印属性使用中括号的形式,打印内容使用.text的形式
#如要将爬取到的内容存储进文件里,可在此使用一个列表进行暂存,然后将该列表写入文件
我们即可获取到所需的全部通知标题了:
3.代码
全部代码如下:
import requests
from bs4 import BeautifulSoup
r = requests.get(r"http://jwc.uibe.edu.cn/")#此处使用原字符串避免产生字符误读
soup = BeautifulSoup(r.text)#soup即为使用BeautifulSoup转化之后的对象
div_newslist = soup.find("ul", class_ = "newsList")#由于class是python关键字,此处需要在class后买你加上下划线
li_lst = div_newslist.find_all("li")#得到的li_lst是一个列表,列表的每一个元素是一个li元素
for li in li_lst:
a = li.find("a")
print(a["title"])#打印属性使用中括号的形式,打印内容使用.text的形式
#如要将爬取到的内容存储进文件里,可在此使用一个列表进行暂存,然后将该列表写入文件
4. 注意
1. 编码问题
有的网站可能不是使用requests默认的”ISO“进行编码,requests获取到的内容可能呈现乱码,这种情况下可以查看requests对象的apparent_encoding属性来查看其编码,并通过设置其encoding属性来改变编码方式。
it_encoding = r.apparent_encoding
print(it_encoding)#根据请求头判断的网页的编码方式
r.encoding = it_encoding
2.休眠问题
当需要爬取一个服务器下的多个网站时,可能会因为访问速度过快被禁止访问,这种情况下一般需要在爬取中进行一定时间的休眠。
import time
import random
#导入两个库
time.sleep(random.random())#休眠一个0到1的随机时间,单位:s
#该语句一般加在每一次访问的前面
#当访问量较大,目标网站反爬虫措施较严格时,可将随机区间延长
3. 请求头问题
部分网站会通过辨认请求头来判定请求是否为人工用户发起的,如果使用爬虫默认的请求头,则拒绝访问的概率较大。
对于部分有反爬措施,但反爬措施不是很严格的网站,可以使用最简单的请求头:
header = {"user-agent" : "Mozilla/5.0"}
对于一些较为严格的网站,可能需要构造专门的请求头来模拟人为访问。
对于其他反反爬手段,敬请参阅本人其他博客