爬虫记录

背景简述

最近在听嵩天老师的网络爬虫的网课,仅以此纪录听课内容,供自己复习。
更新:

  • 铺设框架 20200801
  • 实例1 20200802

Rebots协议

爬虫的规矩,以及如何骗过防爬的小技巧

库的调用

介绍四个常用库,望多多练手,争取熟能生巧。

第三方库:Requests

通过HTTP/HTTPS 协议自动从互联网 获取数据 并向其提交请求的方法

第三方库:BeautifulSoup

从爬取的HTML页面中 解析完整Web信息 的方法(当然想整XML,JSON,YAML的话下载对应的第三方库就好啦)

标准库:Re(正则表达式)

从爬取的HTML页面中 提取关键信息 的方法(搜索关键词用re感觉非常良好)

第三方库Scrapy

通过网络爬虫框架构造专业网络爬虫的基本方法

实例一:大学网站排名:

错误记录

Traceback (most recent call last):
  File "C:/Users/lenovo/Desktop/universities.py", line 40, in <module>
    main()
  File "C:/Users/lenovo/Desktop/universities.py", line 36, in main
    fillUnivList(uinfo, html)  # 填充数据结构
  File "C:/Users/lenovo/Desktop/universities.py", line 18, in fillUnivList
    for tr in soup.find('tbody').chidren:  # 遍历tbody
TypeError: 'NoneType' object is not iterable
  • 最致命:打错了标签的遍历单词:children→chidren ❌

  • 其次,一开始的修改编码也打错了

#r.enconding = r.apparent_enconding 错误
#纠正后
r.encoding = r.apparent_encoding

运行效果
在这里插入图片描述
我们发现中间列的大学名称对齐效果不好。故对此进一步优化。
系统默认西文字符填充,故我们需要修改字符填充代码,改为中文的 chr(12288)

#修改前
print("{:^10}\t{:^6}\t{:^10}".format("排名", "学校名称", "总分"))
    for i in range(num):
        u = ulist[i]
        print("{:^10}\t{:^6}\t{:^10}".format(u[0], u[1], u[2]))
#修改后
    tplt = "{0:^10}\t{1:{3}^10}\t{2:^10}" 
 # {3}意味在使用填充时我们选用的是format的第三个变量填充,也就是中文填充

    print(tplt.format("排名", "学校名称", "分数",chr(12288)))
    # 打印表头
    for i in range(num):
        u = ulist[i]
        print(tplt.format(u[0], u[1], u[2],chr(12288)))

正确运行代码

import requests
from bs4 import BeautifulSoup
import bs4


def getHTMLText(url):
    try:
        r = requests.get(url, timeout=30)
        r.raise_for_status()  # 返回异常信息
        r.encoding = r.apparent_encoding  # 修改编码
        return r.text
    except:
        return ""


def fillUnivList(ulist, html):  # ulist为构建的数据结构
    soup = BeautifulSoup(html, "html.parser")
    for tr in soup.find('tbody').chidren:  # 遍历tbody
        if isinstance(tr, bs4.element.Tag):  # 筛出非标签tr
            tds = tr('td')  # tr标签中的td做查询
            ulist.append([tds[0].string, tds[1].string, tds[3].string])


def printUnivList(ulist, num):  # num 为你希望列表中多少个元素打印出来
    print("{:^10}\t{:^6}\t{:^10}".format("排名", "学校名称", "分数"))
    # 打印表头
    for i in range(num):
        u = ulist[i]
        print("{:^10}\t{:^6}\t{:^10}".format(u[0], u[1], u[2]))


def main():
    uinfo = []  # 大学数据的列表
    url = 'http://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html'
    html = getHTMLText(url)  # 提取网页信息
    fillUnivList(uinfo, html)  # 填充数据结构
    printUnivList(uinfo, 20)  # 20所


main()  #运行主函数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值