相信大家应该都有听说过爬虫吧,但到底什么是爬虫呢?
这里我简单的套用一下百度词条的结果:
网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追
逐者)是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使
用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫
其中爬虫程序
Spider又叫WebCrawler或者Robot,是一个沿着链接漫游Web 文档集合的程序。
它一般驻留在服务器上,通过给定的一些URL,利用HTTP等标准协议读取相应文档,
然后以文档中包括的所有未访问过的URL作为新的起点,继续进行漫游,直到没有
满足条件的新URL为止。WebCrawler的主要功能是自动从Internet上的各Web 站点
抓取Web文档并从该Web文档中提取一些信息来描述该Web文档,为搜索引擎站点
的数据库服务器追加和更新数据提供原始数据,这些数据包括标题、长度、文件建
立时间、HTML文件中的各种链接数目等
说的这么专业,初次看我也不知道是在讲什么
下面说一下我自己的理解:
爬虫程序是一组客户端程序,他的功能是访问web服务器,从服务器中获取网页代码,
网页代码当中包含了许多各种各样的数据信息,程序从中提取我们所关心的数据或是
对我们自己有用的数据,然后通过爬虫程序代码的功能函数实现数据整理并存储在本
地的数据库当中。说的简单点就是偷偷从网页当中获取我们想要的东西
这东西说起来简单,但是困难的是我们往往在一个网页当中难以拼凑出我们想要
的完整数据格式,所以我们通常需要从多个不同的网站当中进行数据抓取并且高效
率的整理数据这才是难点,说这么多理论的,感觉没什么用处,下面我们简单的感受
一下爬虫
from urllib import request
if __name__ == "__main__":
url = "https://wenku.baidu.com/view/7b93d6c251e79b8969022645.html"
head = { }
head['User-Agent']='Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36'
req = request.Request(url, headers = head)
response = request.urlopen(req)
html = response.read().decode(' GBK')
print(html)
效果图:下面是这个网页的源代码
简单看一下我们就会发现我们成功的获取了网页的源代码,其中具体的User-Agent这个有啥要用
简单的说就是有些网站不允许我们直接爬取,我们得隐藏一下自己爬虫的身份,所以用了一个伪
装代理,具体的我们以后有时间再仔细讲解
今天我们要说的不是这个,今天我们先学习一下这么用自己的计算机作为服务器,爬取自己服务器上的数据
我们做一下简单的预备工作
在自己的编译器(我用的编译器是pycharm)当中下载好一些库flask,re,os,rullib
然后建立一个txt文件存一点东西并存好
下面使用这个文件的数据建立服务器
from flask import Flask,request
import os
app = Flask(__name__)
@app.route("/")
def show():
if os.path.exists("students.txt"):
st = ""
fobj = open("students.txt", "rt", encoding="GBK")
while True:
s = fobj.readline().strip("\n")
if s == "":
break
s = s.split(",")
st = st + ""
for i in range(len(s)):
st = st + ""+s[i] + " "
st = st + " "
fobj.close()
st = st + "
"
return st
if __name__ == "__main__":
app.run()
我们简单的看一下运行的结果
说明我们建站成功,然后进入127.0.0.1:5000这个地址看一下显示的结果
然后我们开始准备爬取网页信息的工作
第一步分析网页结构
不难发现这个页面由四个tr标签构成,然后每个tr里面都有四个td标签,然后准备爬取
第一步正则表达的使用
去匹配我们想要的结果并输出,假如我们只想要tr里面的数据我们可以这样写
py r"
这样的话我们就能得到每个tr标签里面的数据.*? "
关于正则表达式的学习,大家可以去看看菜鸟教程-正则表达式语法
所以代码的全部就是
import urllib.request
import re
try:
resp = urllib.request.urlopen("http://127.0.0.1:5000")
data = resp.read()
html = data.decode()
trs = re.findall(r".*? ", html)
for i in trs:
tds = re.findall(r"(.*?) ", i)
for j in tds:
print(j, " ", end='')
print()
except Exception as err:
print(err)
代码运行效果如下
我们发现有点小小的瑕疵就是输出格式不好看,并没有对齐,所以简单的进行一波输出
格式的修改
print(j, " ", end='')替换为print("%-4s"%j, " ", end='')
然后输出结果就变成了这样
其中"%-4s"%的含义是向左靠齐然后并每个字符串只占4个位置这样的话就对齐了,其他更多的
格式控制大家自行百度吧!