目录

爬虫

使用python写爬虫需要的技能

通用爬虫缺点

urllib爬取网页

返回状态码response.getcode()

解码编码

模拟浏览器

设置超时

HTTP请求:进行客户端与服务端之间的消息传递时使用


爬虫

网络爬虫又称网络蜘蛛、网络蚂蚁、网络机器人等,可以自动化浏览网络中的信息,当然浏览信息的时候需要按照我们制定的规则进行,这些规则称之为网络爬虫算法。使用Python可以很方便地写出爬虫程序,进行互联网信息的自动化检索

  1. 爬虫本质上是一段程序(一个脚本)
  2. 能帮我们自动批量采集我们需要的文本信息、图片等资源
  3. 模拟浏览器的自动浏览网页(99%)

之前我也写了有关爬虫的博客,可以参考:

python爬虫爬网络小说 https://blog.csdn.net/qq_36171287/article/details/90180862

python爬虫练习爬取信息 https://blog.csdn.net/qq_36171287/article/details/90575007

python爬虫实验浏览量——凉凉 https://blog.csdn.net/qq_36171287/article/details/91352388

爬虫的设计:

  1. 首先要确定爬取网页的URL地址
  2. 通过HTTP协议来获取对应的HTML页面
  3. 提取HTML页面中有用的数据

使用python写爬虫需要的技能

  • python基本语法
  • 如何抓取页面:HTTP请求处理,ullib处理后的请求可以模拟浏览器发送请求,获取服务器响应的文件
  • 解析服务器响应内容:re、xpath、 BeautifulSoup4、 jsonpath、 pyquery目的是使用某种描述性语法来提取匹配规则的数据
  • 如何获取动态HTML,验证码处理:通用的动态页面采集、Tesseract(机器学习库,机器图像识别系统,识别图片中的文本)
  • Scrapy框架:中国常见的框架Scrapy、Pyspider——高定制性高性能(异步网络框架twisted),所以数据下载速度非常快,提供了数据存储、数据下载、提取规则等组件
  • 分布式策略:scrapy-redis——在Scrapy的基础上添加了-套以Redis数据库为核心的一套组件,让scrapy框架支持分布式的功能,主要在Redis里做请求指纹去重,请求分配、数据临时存储

通用爬虫缺点

  • 只能提供和文本相关的内容(HTML、Word, PDF)等,但是不能提供多媒体(音乐、图片、视频)和二进制文件(程序、脚本)等
  • 提供结果千篇律,不能针对不同人群提供不同的搜索结果
  • 不能理解人类语上的检索

urllib爬取网页

例子:

import urllib.request
#向指定的url地址发起请求,并返回服务器响应的数据(文件的对象)
response = urllib.request.urlopen('http://www.baidu.com')
#读取文件的全部内容,会把读取到的数值赋值给一个字符串变量
data = response.read()
print(data)

#将爬取内容存储到a.txt
with open(r'a.txt','wb') as f:
    f.write(data)

运行结果:

例子:

import urllib.request
#在urlretrieve执行过程中,会存储一些换成
response = urllib.request.urlretrieve('http://www.baidu.com',filename=r'a.html')
#清除缓存
urllib.request.urlcleanup()

运行结果:

例子:

#读取行,会把读取到的数值赋值给列表变量
data = response.readlines()
print(data)

运行结果:

返回当前环境的有关信息response.info()

#response属性
#返回当前环境的有关信息
print(response.info())

运行结果:

返回状态码response.getcode()

HTTP响应状态码:

100 客户必须继续发出请求
101 客户要求服务器根据请求转换HTTP协议版本
200 交易成功
201 提示知道新文件的URL
202 接受和处理、但处理未完成
203 返回信息不确定或不完整
204 请求收到,但返回信息为空
205 服务器完成了请求,用户代理必须复位当前已经浏览过的文件
206 服务器已经完成了部分用户的GET请求
300 请求的资源可在多处得到
301 删除请求数据
302 在其他地址发现 了请求数据
303 建议客户访问其他URL或访问方式
304 客户端已经执行了GET,但文件未变化
305 请求的资源必须以服务器指定的地址得到
306 前一版本HTTP中使用的代码, 现行版本中不再使用
307 申明请求的资源临时性删除
400 错误请求,如语法错误
401 请求授权失败

例子:

response = urllib.request.urlopen('http://www.baidu.com')

#返回状态码
print(response.getcode())

运行结果:

解码编码

解码unquote()

url = 'https://www.so.com/s?ie=utf-8&src=hao_isearch2_3.6.9&q=%E7%A6%BB%E5%A4%A9%E5%A4%A7%E5%9C%A3&eci='
#解码
newUrl = urllib.request.unquote(url)
print(newUrl)

运行结果:

编码quote()

url = 'https://www.so.com/s?ie=utf-8&src=hao_isearch2_3.6.9&q=离天大圣='
#解码
newUrl = urllib.request.quote(url)
print(newUrl)

运行结果:

模拟浏览器

import urllib.request
url = 'http://www.baidu.com'
#模拟请求头
headers = {
    'User-Agent':'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)'
}
#设置一个请求体
req = urllib.request.Request(url,headers=headers)
#发起请求
response = urllib.request.urlopen(req)
data = response.read().decode('utf-8')
print(data)

运行结果:

设置超时

如果网页长时间不反应,系统判断超时,无法爬取

import urllib.request
url = 'http://www.baidu.com'
#模拟请求头
headers = {
    'User-Agent':'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)'
}
#设置一个请求体
req = urllib.request.Request(url,headers=headers)
#发起请求
for i in range(1,100):
    try:
        response = urllib.request.urlopen(req,timeout=0.5)
        print(len(response.read().decode('utf-8')))
    except:
        print('请求超时,继续下一个爬取')

运行结果:

HTTP请求:进行客户端与服务端之间的消息传递时使用

https://www.runoob.com/http/http-methods.html

GET:通过url网址传递信息,可以直接在URL网址上添加要传递的信息
POST:可以向服务器提交数据,是一种比较流行的比较安全的数据传递方式
PUT:请求服务器存储一个资源,通常要指定存储的位置
DELETE:请求服务器删除一个资源
HEAD:请求获取对应的HTTP抱头信息
OPTIONS:可以获取当前URL所支持的请求类型

GET:
特点:把数据拼接到请求路径的后面传递给服务器
优点:速度快
缺点:承载的数据量小,不安全
特点:把参数进行打包,单独传输
优点:数量大,安全(当对服务器数据进行修改时建议使用post)
缺点:速度慢

0, GET: GET可以说是最常见的了,它本质就是发送一个请求来取得服务器上的某一资源。 资源通过一组HTTP头和呈现数据(如HTML文本,或者图片或者视频等)返回给客户端。GET请求中,永远不会包含呈现数据。

1, HEAD: HEAD和GET本质是一样的,区别在于HEAD不含有呈现数据,而仅仅是HTTP头信息。有的人可能觉得这个方法没什么用,其实不是这样的。想象一个业务情景:欲判断某个资源是否存在,我们通常使用GET,但这里用HEAD则意义更加明确。

2, PUT:这个方法沘较少见。HTML表单也不支持这个。本质上来讲, PUT和POST极为相似,都是向服务器发送数据,但它们之间有一个重要区别,PUT通常指定了资源的存放位置,而POST则没有,POST的数据存放位置由服务器自己决定。举个例子:如一个用于提交博文的URL, /addBlog。 如果用PUT,则提交的URL会是像这样的”/addBlog/abc123” ,其中abc123就是这个博文的地址。而如果用POST,则这个地址会在提交后由服务器告知客户端。目前大部分博客都是这样的。显然,PUT和POST用途是不一样的。具体用哪个还取决于当前的业务场景。

3, DELETE: 删除某一个资源。基本上这个也很少见,不过还是有一些地方比如amazon的S3云服务里面就用的这个方法来删除资源。

4, POST:向服务器提交数据。这个方法湖途广泛,几呼目前所有的提交操作都是靠这个完成。

5, OPTIONS:这个方法很有趣,但极少使用。它用于获取当前URL所支持的方法。若请求成功,则它会在HTTP头中包含一个名为"Allow" 的头,值是所支持的方法,如“GET, POST"

一起学习,一起进步 -.- ,如有错误,可以发评论