文章目录
一.初探数据
概述
爬虫通俗的讲呢就是能够自动访问互联网并将网站内容下载下来的程序或脚本,类似一个机器人,能够把别人网站的信息弄到电脑上,在做一些过滤,筛选,归纳,整理,排序等。
网络爬虫又名Web Spider,即把互联网比喻成一个蜘蛛网,那么spider就是在网上爬来爬去的蜘蛛。网络蜘蛛就是通过网页的连接来寻址网页,从网站的某个页面(通常是首页)开始,读取网页的内容,找到在网页中的其他连接地址,然后通过这些连接地址寻找下一个网页,这样一直循环,直到把这个网站所有网页都抓取完为止。
如果把整个互联网当成一个网站,那么爬虫就可以用这个原理把互联网上所有的网页抓取下来。
编程语言
本次教程使用的是python,这是菜鸟教程python的连接,有需要的读者可以移步做进一步了解。
爬虫平台
Pycharm官网链接传送门
二.前提知识
URL
Universal Resource Locator 即统一资源定位符)URL 是对能从 Internet 上得到资源的位置和访问方法的一种简洁的表示。URL 给资源的位置提供一种抽象的识别方法,并用这种方法给资源定位,使得系统得以对资源(指 Internet 上可以访问的任何对象,包括文件目录、文件、文档、图像等,以及其他任何形式的数据)进行各种操作,如存储、更新、替换和查找其属性。
<URL 的访问形式>://<主机>:<端口>/<路径>
其实是有端口的,http协议默认端口是80不用写
https端口默认是443
左边的<URL 的访问形式>主要有文件传送协议(FTP)、超文本传送协议(HTTP)等方式,常见形式为 HTTP,下面将会介绍到。<主机>一项是必须的,<端口>和<路径>有时侯可省略。
可参考下面文章:
快速了解url的构成
HTTP
HTTP(HyperText Transfer Protocol 即超文本传输协议)是一个简单的请求——响应协议,通常运行在 TCP 之上,它指定了客户端可能发送给服务器的消息,以及得到的响应。
HTML
HTML(HyperText Markup Lanhguage 即超文本标记语言)是一种制作万维网页面的标准语言,它消除了计算机信息交流的障碍。HTML 定义了许多用于排版的”标签“,各种标签嵌入到万维网的页面就构成了 HTML 文档,所要爬取的页面也基本是 HTML 网页。
三.请求
请求,由客户端向服务器发出。常用的两种请求有 get 和 post。get 一般用来获取数据、 post 用来提交数据。
一个请求包含三个要素,分别是:
○1请求方法 URI 协议/版本
○2请求头(Request Header)
○3请求正文
四.响应
响应(Response),由服务器构造 POST 请求,需要使用正确的 Content-Type,并了解各种请求库的各个参数设置时使用的是哪种 Content-Type,不然可能会导致 POST 提交后无法正常响应。
○1响应状态
200:成功
301:跳转
404:找不到页面或者服务器存在问题
502:服务器错误
浏览器内同样可查看
○2响应头:如内容类型,内容长度,服务器信息,设置 cookie 等
○3响应体:最主要部分,包含了请求资源内容,如网页 HTML,图片,二进制数剧等
五.基本库
requests 是 python 实现的简单易用的 HTTP 库,使用起来比 urllib 简洁很多,所以在次教程只讲解 Requests 库。
requests安装
(1)因为是第三方库,所以使用前需要 cmd 安装。
pip3 install requests
命令行操作如下:
先找到我的电脑中pip3的安装路径
进入目录下安装
我是已经安装过所以显示已安装,这里就是演示一下。
接下来进入pycharm
基本用法
(2)基本用法:requests.get()用于请求目标网站。
写入代码
import requests
response = requests.get('http://www.baidu.com')
print(response.status_code) #打印状态码
print(response.url) #打印请求 url
print(response.headers) #打印头信息
print(response.cookies) #打印 cookie 信息
print(response.text) #以文本形式打印网页源码 print(response.content) #以字节流形式打印
运行结果如下:
还记得我们在响应板块谈到的响应状态为200就代表成功吗 😃
(3)各种请求方式
import requests
requests.get('http://httpbin.org/get')
requests.post('http://httpbin.org/post')
requests.put('http://httpbin.org/put')
requests.delete('http://httpbin.org/delete')
requests.head('http://httpbin.org/get')
requests.options('http://httpbin.
六.解析库
解析库有 Xpath、Pyquery、BeautifulSoup 等。Xpath,全称 XML Path Language,即 XML 路径语言,它是一门在 XML 文档中查找信息的语言,Xpath 可用来在 XML 文档中对元素和属性进行遍历;如果你比较喜欢用 CSS 选择器,那么推荐你使用 Pyquery;BeautifulSoup 是个强大的解析工具,它借助网页的结构和属性等特征来解析网页,提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。
BeautifulSoup
下面来讲解BeautifulSoup 的一些基本用法。
(1)安装
pip3 install beautifulsoup4
像安装requests一样在命令行安装!
(2)导入 bs4 库
from bs4 import BeautifulSoup
(3)先创建一个字符串
html = '''
<html>
<body>
<h1 id="title">Hello World</h1>
<a href="#link1" class="link">This is link1</a> <a href="#link2" class="link">This is link2</a>
</body>
</html>
'''
(4)创建 beautifulsoup 对象
soup = BeautifulSoup(html)
(5)打印一下 soup 对象的内容,格式化输出.
print soup.prettify()
完整代码如下:
from bs4 import BeautifulSoup
html = '''
<html>
<body>
<h1 id="title">Hello World</h1>
<a href="#link1" class="link">This is link1</a> <a href="#link2" class="link">This is link2</a>
</body>
</html>
'''
soup = BeautifulSoup(html,"html.parser")
print (soup.prettify()) #g个死话输出
输出结果如下:
格式化完整输出soup对象
(6)Soup.select()函数用法
获取指定标签的内容
代码如下:
from bs4 import BeautifulSoup
html = '''
<html>
<body>
<h1 id="title">Hello World</h1>
<a href="#link1" class="link">This is link1</a> <a href="#link2" class="link">This is link2</a>
</body>
</html>
'''
soup = BeautifulSoup(html,"html.parser")
header = soup.select('h1')
print (type(header))
print (header)
print (header[0])
print (type(header[0]))
print (header)
输出如下:
获取指定标签的位置用#
title = soup.select('#title')
print type(title)
print title[0].text
输出:
<type 'list'>
Hello World
find函数
(7)Soup.find()和 soup.find_all()函数用法
(1)find()和 find_all()函数原型:
find 和 find_all 函数都可根据多个条件从 html 文本中查找标签对象,只不过 find 的返回对象类型为 bs4.element.Tag,为查找到的第一个满足条件的 Tag;而 find_all 的返回对象为bs4.element.ResultSet(实际上就是 Tag 列表),这里主要介绍 find 函数,find_all 函数类似。
find(name=None,attrs={},recursive=True,text=None,**kwargs)
find_all(name=None,attrs={},recursive=True,limit=None,**kwargs)
注:其中 name、attrs、text 的值都支持正则匹配。
获取指定标签的内容:
from bs4 import BeautifulSoup
html = '<p><a href="www.test.com" class="mylink1 mylink2">this is mylink</a></p>'
soup = BeautifulSoup(html,"html.parser")
a1 = soup.find('a')
print (type(a1))
输出结果如下:
再来
from bs4 import BeautifulSoup
html = '<p><a href="www.test.com" class="mylink1 mylink2">this is mylink</a></p>'
soup = BeautifulSoup(html,"html.parser")
a1 = soup.find('a')
print (a1.name)
print (a1['href'])
print (a1['class'])
print (a1.text)
输出结果
代码要自己敲,多体会find函数的用法还有代码格式和输入一定要在英文输入法的前提下输入 😃
多个条件的正则匹配:
代码如下:
from bs4 import BeautifulSoup
import re
html = '<p><a href="www.test.com" class="mylink1 mylink2">this is mylink</a></p>'
soup = BeautifulSoup(html,"html.parser")
a2 = soup.find(name=re.compile(r'\w+'), class_=re.compile(r'mylink\d+'),text = re.compile(r'^this.+link$'))
print (a2)
运行结果如下:
find 函数的链式调用
代码如下:
from bs4 import BeautifulSoup
import re
html = '<p><a href="www.test.com" class="mylink1 mylink2">this is mylink</a></p>'
soup = BeautifulSoup(html,"html.parser")
a3 = soup.find('p').find('a')
print (a3)
运行结果:
七.数据格式
(1)网页文本:HTML 文档,json 格式文件等。
(2)图片:获取到的是二进制文件,保存为图片格式。
(3)视频:同为二进制文件,保存为视频模式即可。
(4)其他。
八.保存数据的方式
(1)文本:纯文本,json,xml 等。
(2)关系型数据库:mySQL,Oracle,SQLServer 等具有结构化表结构形式存储。
(3)非关系型数据库:MongoDB,Redis 等 key-value 形式存储。
(4)二进制文件:如图片,视频,音频等直接保存特定格式即可。