• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Python爬虫—爬取大学某个学院的教师信息并存储

武飞扬头像
学习学习~~
帮助1

目录

   前言

         一、爬虫是什么?

         二、简要介绍要使用的库

1. urllib 库

2.BeautifulSoup 库

三、爬取的完整代码

   总结



前言

本文是作者学习爬虫内容后进行的一次实战并总结,也只是总结,没有用于其他用途(⊙o⊙)…


一、爬虫是什么?

既然学习爬虫了,要先明白爬虫是个啥?

百度一下:

网络爬虫是一种自动获取网页内容的程序,是搜索引擎的重要组成部分。网络爬虫为搜索引擎从万维网下载网页。

学习时视频里的老师简单概述的:

客户端给服务器发送一个请求,服务器接收后,给出一个响应,这个响应是以html格式输出的,里面就是咱们要爬取的内容(用代码模仿正常的浏览器去向服务器发送请求,服务器响应的内容就是咱们要爬取的),可以看下图,更生动一些。

学新通

二、简要介绍要使用的库

1. urllib 库

urllib 库是 python 内置的 HTTP 请求库,包括以下模块:

  • urllib.request                  请求模块
  • urllib.error                      异常处理模块
  • urllib.parse                     url 解析模块
  • urllib.robotparser            robots.txt 解析模块

这个网站是get请求方式(按f12,点击网络,刷新,可以看到发出和响应的信息)

学新通

  1.  
    import urllib.request
  2.  
    # 获取一个get请求
  3.  
    response = urllib.request.urlopen("https://xxxx") # 网站的地址url
  4.  
    print(response.read().decode("utf-8")) # 获取网页源码并转码

 代码结果输出如下(只截取部分)

学新通

 上面是get请求,那post请求呢?

如下:

  1.  
    import urllib.request
  2.  
    import urllib.parse
  3.  
    url = "http://httpbin.org/post"
  4.  
    cookie = '''
  5.  
    JSESSIONID=1C56AA5DBE020FEAB6C50F7FDDE68110
  6.  
    '''
  7.  
    headers = {
  8.  
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"
  9.  
    }
  10.  
    # 加上头部信息,不容易被查出是爬虫,按f12,点击网络,刷新,可以看到所有的请求信息,User-Agent直接复制过来
  11.  
    data = bytes(urllib.parse.urlencode({"Cookie":cookie}),encoding='utf-8')
  12.  
    # #模拟登陆获取信息,字典的数据是账号密码、cookie等
  13.  
    req = urllib.request.Request(url=url,data=data,headers=headers,method="POST")
  14.  
    response = urllib.request.urlopen(req)
  15.  
    print(response.read().decode('utf-8'))
学新通

代码结果输出如下没有headers时的结果(出现这个结果就是post请求是成功的):

学新通

 注意:看上图的User-Agent这个后面是Python..,这是因为我没有带headers信息,所以如果不带这个headers,在真实的爬取中,会百分百被识别是爬虫的。

带上headers在爬取一次:

学新通

 可以看到User-Agent这个是咱们自己的浏览器信息,cookie也带上了,这样网站不容易查出咱们是爬虫。

2.BeautifulSoup 库

BeautifulSoup 是 Python 的一个第三方库,可以用来解析 html 数据,我们使用它的主要功能就是从网页抓取解析数据:

  • BeautifulSoup 提供一些简单的、python 式的函数用来处理导航、搜索、修改分析树等功能
  • BeautifulSoup 通过解析文档为用户提供需要抓取的数据
  • BeautifulSoup 自动将输入文档转换为 Unicode 编码,输出文档转换为 utf-8 编码

BeautifulSoup 将复杂的 HTML 文档转换成一个复杂的树形结构,每个节点都是 Python对象。所有对象可以归纳为4种类型:

Tag:HTML 或者 XML 中的标签
NavigableString:标签中的文本内容(不包含标签)
BeautifulSoup:BeautifulSoup 对象表示一个文档的全部内容,支持遍历文档树和搜索文档树
Comment:HTML和XML中的注释

利用 BeautifulSoup() 将上面读取到的 html 文档进行转换,如下:

  1.  
    import urllib.request
  2.  
    from bs4 import BeautifulSoup
  3.  
    response = urllib.request.urlopen("https://xxx") # 网站的地址
  4.  
    html = response.read().decode("utf-8")
  5.  
    bs = BeautifulSoup(html,'html.parser') # 用于解析获取到的源码

获得源码后,BeautifulSoup给解析完页面后,使用find_all()来进行文档的搜索。

 find_all()为搜索文档树,搜索当前tag的所有tag子节点,并判断是否符合过滤器的条件。返回值类型是 bs4.element.ResultSet,即返回的是多个该对象的集合,可以用for循环遍历,完整的语法如下:
find_all( name, attrs, recursive, string, **kwargs)
参数意义如下:

name:查找所有名字为 name 的 tag。
attr:tag的属性(即标签的属性)
string:搜索文档中string字符串的内容
recursive: 调用 tag 的 find_all() 方法时,BeautifulSoup 会检索当前 tag 的所有子孙节点;如果只想搜索tag的直接子节点,可以使用参数 recursive=False

首先分析一下网页,找到自己需要的信息,例如:爬取教师的信息,可以看到信息在table class="listTable"的下面,而其他的我们并不需要。

学新通

 爬取到我们需要的信息如下:

学新通

 接着分析会发现,每个老师的信息都单独在一个<tr id="line_u5_*">中,*是一个数字,应该是序号,接着一步一步靠近自己需要的信息即可。

三、爬取的完整代码

代码的整体思想就是:

1.分析出网址的规律,发现只有页数的变化,所以不变的一部分就赋值在baseurl,爬取每页的时候,在进行补全。

2.函数askUrl()用来一页一页的解析页面,并返回得到的页面,给getData()函数,此函数就是获取需要的信息,并保存到一个列表中,最后返回到saveDate()。

  1.  
    # codeing = utf-8
  2.  
    from bs4 import BeautifulSoup
  3.  
    import xlwt
  4.  
    import re
  5.  
    import urllib.request, urllib.error
  6.  
     
  7.  
    b = 0 # 网页的内容 不是很规律,定义个变量
  8.  
    def main():
  9.  
    baseurl = 'https://xxxx' # 目标网站
  10.  
    datalist = getData(baseurl)
  11.  
    saveDate(datalist)
  12.  
     
  13.  
     
  14.  
    def getData(baseurl): # 获取数据
  15.  
    datalist = []
  16.  
    for i in range(1,8): # 要爬取很多页面,这个是循环,配上baseurl用的,就是找到每一页的网址
  17.  
    if i == 7:
  18.  
    url = baseurl '.htm'
  19.  
    b = 20
  20.  
    elif i == 1:
  21.  
    b = 20
  22.  
    url = baseurl '/' str(i) '.htm'
  23.  
    else:
  24.  
    b = 38
  25.  
    url = baseurl '/' str(i) '.htm'
  26.  
    html = askUrl(url)
  27.  
    # soup = BeautifulSoup(str(html), 'html.parser')
  28.  
     
  29.  
    for i in range(0,b):
  30.  
    data = []
  31.  
    soup = BeautifulSoup(str(html), 'html.parser')
  32.  
    html1 = soup.find_all(id="line_u5_" str(i) "")
  33.  
    soup = BeautifulSoup(str(html1),'html.parser')
  34.  
    # print(soup)
  35.  
    list = soup.find_all('td')
  36.  
    # print(soup)
  37.  
    for j in range(0,7):
  38.  
    data.append(list[j].get_text().replace(' ',''))
  39.  
    datalist.append(data)
  40.  
    return datalist
  41.  
     
  42.  
    def askUrl(url): # 页面解析
  43.  
    headers = {
  44.  
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36",
  45.  
    'accept':'text / html, application / xhtml xml, application / xml;q = 0.9, image / avif, image / webp, image / apng, * / *;q = 0.8, application / signed - exchange;v = b3; q = 0.9'
  46.  
    } # 头部信息,头部信息越全面,不容易被识别出
  47.  
    cookie = '''
  48.  
    JSESSIONID=1C56AA5DBE020FEAB6C50F7FDDE68110
  49.  
    '''
  50.  
    data = bytes(urllib.parse.urlencode({'Cookie':cookie}),encoding='utf-8')
  51.  
    request = urllib.request.Request(url=url, data=data, headers=headers, method='GET')
  52.  
    response = urllib.request.urlopen(request)
  53.  
    html = response.read().decode('utf-8') # 未处理的全部页面
  54.  
    soup = BeautifulSoup(html,'html.parser') # 一次解析页面
  55.  
    html = soup.find_all('table',class_='listTable') # 筛选出需要的
  56.  
    # soup = BeautifulSoup(str(html),'html.parser')
  57.  
    return html
  58.  
    # for i in range(1,20):
  59.  
    # html = soup.find_all('tr',id="line_u5_" str(i) "")
  60.  
    def saveDate(datalist): # 保存数据,这里保存到了Excel中了
  61.  
    k=0
  62.  
    book = xlwt.Workbook('encoding = utf-8') # 获取工作薄
  63.  
    sheet = book.add_sheet('信息',cell_overwrite_ok=True) # 增加个表
  64.  
    col = ['姓名','性别','民族','学历','职位','专业一','专业二']
  65.  
    for i in range(0,7):
  66.  
    sheet.write(0,i,col[i]) # 单元格是从下表0,0开始的
  67.  
    for list in datalist:
  68.  
    k = k 1
  69.  
    for j in range(0,7):
  70.  
    sheet.write(k,j,list[j])
  71.  
    book.save('信息.xls')
  72.  
     
  73.  
     
  74.  
    if __name__ == main():
  75.  
    main()
学新通

运行后,你的PyCharm里的左侧的项目栏里会出现信息这个表,就是爬取后保存的。


总结

1.上述只能爬取一些反爬机制不强的网站,例如爬取异步加载的网站还需要调整几个部分,接下来会写怎么爬取异步加载的网站。

2.在爬虫的时候,先爬取一页,并用html的形式保存这一页,然后就先不要爬取了,只需要在保存的这一页上实验就可以了,不然你调整一下,爬取一下,对方的网站识别出爬虫,是会封你的IP的,还有是用for循环获取页面的时候,每获取一页设置停顿一会,这样对方网站认为你是正常的用户而不是爬虫,不然一个for循环获取好几页,会被识别出来是爬虫的。

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgfabhb
系列文章
更多 icon
同类精品
更多 icon
继续加载