Python初级爬虫——爬取UIBE教务处(requests+bs4)

最基础爬虫——Python requests+bs4爬取UIBE教务处

1.使用工具

1.Python 3.x

2.第三方库 requests,bs4

3.浏览器

2.具体思路

UIBE教务处网站开放程度较高,无反爬虫措施,只需要使用最基础的爬虫手段即可。使用requests库获取网页源码,使用bs4中BeautifulSoup库进行网页解析,定位到目标元素即可。

首先得到教务处网站url为:http://jwc.uibe.edu.cn/

Python初级爬虫——爬取UIBE教务处(requests+bs4)
导入两个第三方库:

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检查,点击左上角的定位标识打开定位模式,再点击第一条重要通知

Python初级爬虫——爬取UIBE教务处(requests+bs4)

从右侧的界面源码中我们可以观察到,每一条通知展示在页面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的形式
    #如要将爬取到的内容存储进文件里,可在此使用一个列表进行暂存,然后将该列表写入文件

我们即可获取到所需的全部通知标题了:
Python初级爬虫——爬取UIBE教务处(requests+bs4)

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"}

对于一些较为严格的网站,可能需要构造专门的请求头来模拟人为访问。

对于其他反反爬手段,敬请参阅本人其他博客

上一篇:Python新手爬虫训练小项目《爬取彼岸图网》(超详细讲解版)


下一篇:基础入门爬虫:教你怎么用Python爬取爱奇艺热门电影