Python爬虫基础教程

Python爬虫基础教程

  • 本文档创作于2021/5/2

  • 作者:南京航空航天大学 Eric

0.网络爬虫

  • 网络爬虫,是一种按照一定规则,自动抓取互联网信息的程序或者脚本。由于互联网数据的多样性和资源的有限性,根据用户需求定向抓取相关网页并分析已成为如今主流的爬取策略。

搜索引擎的工作原理

  • 通用搜索引擎的处理对象是互联网网页,目前网页数量以百亿计,搜索引擎的网络爬虫能够高效地将海量的网页数据传下载到本地,在本地形成互联网网页的镜像备份。它是搜索引擎系统中很关键也很基础的构件。

爬虫的基本流程是 获取数据->解析内容->保存数据

1.爬虫所需要的模块和包

自带安装的有urllib包(用于网站获取)、re模块(正则表达式文字匹配)、sqlite包(进行sqlite数据库操作)。
需要安装的有bs4包(用于处理搜索HTML文件)、xlwt包(用于进行Excel操作)。

# BeautifulSoup将复杂HTML文档转换成复杂的树形结构,每个节点都是Python对象
from bs4 import BeautifulSoup  # 导入bs4包中的__init__.py下的BeautifulSoup类,用于网页解析,获取数据

import re  # 正则表达式,进行文字匹配
import urllib.request, urllib.error  # 指定URL,获取网页数据
import xlwt  # 进行excel操作
import sqlite3  # 进行sqlite数据库操作

2.测试get,post获取网页信息的方式和常用技巧

对于一个http网页,主要有以下五种方法:DELETE,PATCH,GET,POST,PUT。这里主要介绍最常用的GETPOST方法。

  • 直接访问一个网页,相当于对网页发送了get请求。
def get():
    # 用urlopen方法获取一个get请求
    response = urllib.request.urlopen("http://www.baidu.com")
    # 获取的网页默认为字节格式,对获取到的网页进行utf-8解码成字符串
    html = response.read().decode("utf-8")
    print(html)
  • 像登录这种操作需要传递表单信息的相当于发送post请求。
def post():
    # 用urlencode方法对表单数据(字典)编码,并转换为字节数据,字符集为utf-8
    data = bytes(urllib.parse.urlencode({"hello": "world"}), encoding="utf-8")
    # 用urlopen方法获取post一个请求,需要附带表单信息
    response = urllib.request.urlopen("http://httpbin.org/post", data=data)
    # 读取到的信息是服务器返回的
    print(response.read().decode("utf-8"))
  • 对于网站卡顿,无法及时作出回应或者网页打不开的情况需要做超时处理try-except,即在urlopen方法中设置关键字参数timeout,超时抛出urllib.error.URLError异常。
def timeout():
    try:
        # 设置timeout关键字参数,如果超出设定时间,报错并捕获
        response = urllib.request.urlopen("http://www.baidu.com", timeout=3)
        print(response.read().decode("utf-8"))
    except urllib.error.URLError as reason:
        print("time out!")
  • 获取网页的其他信息(如状态信息,头部信息等)。
def getheaders():
    response = urllib.request.urlopen("http://www.baidu.com")
    # 获取状态信息(200即连接成功)
    print(response.status)
    # 获取头部信息(即浏览器中Response Headers中的表单信息)
    for each in response.getheaders():
        print(each)
    print(response.getheader("Server"))

3.测试模拟浏览器访问httpbin.org和豆瓣解析网页源码

def httpbinTest():
    # 准备表单信息以发送post请求
    data = bytes(urllib.parse.urlencode({"name": "Eric"}), encoding="utf-8")
    # 准备头部文件模拟真实浏览器(可在浏览器控制台中最下方找到)
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
                      "Chrome/90.0.4430.72 Safari/537.36 "
    }
    url = "http://httpbin.org/post"
    # 将网址、表单信息、头部信息、发送模式集成了一个Request对象,方便直接urlopen
    req = urllib.request.Request(url=url, data=data, headers=headers, method="POST")
    response = urllib.request.urlopen(req)
    print(response.read().decode("utf-8"))
def visitDouban():
    # 准备头部文件模拟真实浏览器(可在浏览器控制台中最下方找到)
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
                      "Chrome/90.0.4430.72 Safari/537.36 "
    }
    url = "https://movie.douban.com/top250"
    # 将网址、头部信息集成了一个Request对象,方便直接urlopen
    req = urllib.request.Request(url=url, headers=headers)
    response = urllib.request.urlopen(req)
    print(response.read().decode("utf-8"))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值