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
。这里主要介绍最常用的GET
和POST
方法。
- 直接访问一个网页,相当于对网页发送了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"))