目录
一、网络爬虫简介:
网络爬虫也被称为网络蜘蛛、网络机器人,是一个自动下载网页的计算机程序或自动化脚本。
网络爬虫就像一只蜘蛛一样再互联网上沿着URL的丝路爬行,下载每一个URL所指向的网页,并分析和获取页面内容。
网络爬虫的功能强大,可以进行收集数据(最直接、最常用的使用方法),尽职调查,刷流量和秒杀等功能。
爬虫再爬取数据时将会作为客户端模拟整个HTTP通信过程,该程序也需要通过HTTP协议实现。
HTTP请求方式的常用方法有以下四种:
请求方法 | 方法描述 |
GET | 请求指定的页面信息,并返回实体主体。GET可能会被网络爬虫等随意访问,因此GET方法应该只用在读取数据,而不应当被用于产生“副作用”的操作中,例如在Web Application中 |
HEAD | 与GET方法一样,都是向服务器发出指定资源的请求。只不过服务器将不传回具体的内容,使用这个方法可以在不必传输全部内容的情况下,就可以获取其中该资源的相关信息(元信息或称元数据) |
POST | 向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。数据会被包含在请求中,这个请求可能会创建新的资源或修改现有资源,或二者皆有 |
PUT | 从客户端上传指定资源的最新内容,即更新服务器端的指定资源。 |
几种常见的HTTP状态码种类
状态码类型 | 状态码意义 |
1XX | 表示请求已被接受,需接后续处理。这类响应是临时响应,只包含状态行和某些可选的响应头信息,并以空行结束 |
2XX | 表示请求已成功被服务器接收、理解并接受 |
3XX | 表示需要客户端采取进一步的操作才能完成请求。通常用来重定向,重定向目标需在本次响应中指明 |
4XX | 表示客户端可能发生了错误,妨碍了服务器的处理。 |
5XX | 表示客户端可能发生了错误,妨碍了服务器的处理。 |
常见的HTTP状态码
常见状态码 | 状态码含义 |
200 OK | 请求成功,请求所希望的响应头或数据体将随此响应返回。 |
400 Bad Request | 由于客户端的语法错误、无效的请求或欺骗性路由请求,服务器不会处理该请求 |
403 Forbidden | 服务器已经理解该请求,但是拒绝执行,将在返回的实体内描述拒绝的原因,也可以不描述仅返回404响应 |
404 Not Found | 请求失败,请求所希望得到的资源未被在服务器上发现,但允许用户的后续请求 |
500 Internal Server Error | 通用错误消息,服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理,不会给出具体错误信息 |
503 Service Unavailable | 由于临时的服务器维护或者过载,服务器当前无法处理请求。这个状况是暂时的,并且将在一段时间以后恢复 |
二、正则表达式:
正则表达式在网络爬虫中非常重要,可以在一大段文字中提取出有用的信息,虽然正则表达式不是最简单和高效的数据提取方式,但是是最直接的方式。
正则表达式的基本符号:
1.点号“.”:
一个点号可以代替除了换行符以外的任何一个字符,包括但不限于英文字母、数字、汉字、英文标点符号和中文标点符号。
2.星号“*”、加号“+”:
一个星号可以表示它前面的一个子表达式(普通字符、另一个或几个正则表达式符号)0次到无限次。(一个加号“+”表示匹配1次到无限次)。
3.问号“?”:
问号表示它前面的子表达式0次或者1次。注意,这里的问号是英文问号。
4.反斜杠“\”:
反斜杠在正则表达式里面不能单独使用,甚至在整个Python里都不能单独使用。反斜杠需要和其他的字符配合使用来把特殊符号变成普通符号,把普通符号变成特殊符号。
5.数字“\d”:
“\d”用来表示一位数字,“\d”需要看成一个整体
6.小括“()”:
小括号可以把括号里面的内容提取出来。
在Python中使用正则表达式:
1.findall():
Python的正则表达式模块包含一个findall方法,它能够以列表的形式返回所有满足要求的字符串。
findall的函数原型为:
re.findall(pattern, string, flags=0)
pattern表示正则表达式,string表示原来的字符串,flags表示一些特殊功能的标志。
import re
content = '我的微博密码是:1234567,QQ密码是:33445566,银行卡密码是:888888,Github密码是:999abc999'
password_list=re.findall(':(.*?),',content)
print('找到内容,返回:{}'.format(password_list))
findall()结果是列表。
2.search():
search()的用法和findall()的用法一样,但是search()只会返回第1个满足要求的字符串。一旦找到符合要求的内容,它就会停止查找。对于从超级大的文本里面只找第1个数据特别有用,可以大大提高程序的运行效率。
search()的函数原型为:
re.search(pattern, string, flags=0)
import re
content = '我的微博密码是:1234567,QQ密码是:33445566,银行卡密码是:888888,Github密码是:999abc999'
password_search=re.search('密码是:(.*?),',content)
password_search_not_find=re.search('xxx:(.*?),',content)
print(password_search)
print(password_search.group())
print(password_search.group(0))
print(password_search.group(1))
print(password_search_not_find)
对于结果,如果匹配成功,则是一个正则表达式的对象;如果没有匹配到任何数据,就是None。
如果需要得到匹配到的结果,则需要通过.group()这个方法来获取里面的值,如下图所示。
3.“.*”和“.*?”的区别
①“.*”:贪婪模式,获取最长的满足条件的字符串。
②“.*?”:非贪婪模式,获取最短的能满足条件的字符串。