网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。“简单来说,爬虫类似手动下载网页信息,这个信息可以是歌曲,小说等等。
URL:(Universal Resource Locator即统一资源定位符)URL是对能从Internet上得到资源的位置和访问方法的一种简洁的表示。URL给资源的位置提供一种抽象的识别方法,并用这种方法给资源定位,
使得系统得以对资源(指Internet上可以访问的任何对象,包括文件目录、文件、文档、图像等,以及其他任何形式的数据)进行各种操作,如存储、更新、替换和查找其属性。
URL的一般形式为:
<URL的访问形式>://<主机>:<端口>/<路径>
左边的<URL的访问形式>主要有文件传送协议(FTP)、超文本传送协议(HTTP)等方式,常见形式为HTTP,下面将会介绍到。<主机>一项是必须的,<端口>和<路径>有时侯可省略。
HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。。
HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。
特点:(1)无连接的(即每次连接只能处理一个请求,完成后,断开连接)
(2)媒体独立的(任何类型的数据都可以通过HTTP传送)
(3)无状态的(没有记忆能力)
HTML:(HyperText Markup Lanhguage 即超文本标记语言)HTML是一种制作万维网页面的标准语言,它消除了计算机信息交流的障碍。HTML定义了许多用于排版的”标签“,各种标签嵌入到万维网的页面就构成了HTML文档。我们所要爬取的页面也基本是HTML网页。所以对于HTML中的一些标签需要有所了解,同时也可了解用来控制网页样式布局的CSS,方便以后的解析网页。
抓包分析:可以通过按f12查看源码
:通过抓包分析工具 Fiddler,浏览器F12+F5
正则表达式:(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等
组件:可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组
使用这个r的各种方法和函数
获取网页编码:r.encoding
当你发送请求时,requests会根据HTTP头部来猜测网页编码,当你使用r.text时,requests就会使用这个编码。当然你还可以修改requests的编码形式。
json:
像urllib和urllib2,如果用到json,就要引入新模块,如json和simplejson,但在requests中已经有了内置的函数,r.json()
网页状态码:
用r.status_code来检查网页的状态码。
响应头内容:
通过r.headers来获取响应头内容。
设置超时时间:
通过timeout属性设置超时时间,一旦超过这个时间还没获得响应内容,就会提示错误。
代理访问
采集时为避免被封IP,经常会使用代理。requests也有相应的proxies属性。
请求头内容
请求头内容可以用r.request.headers来获取。
2.BeautifulSoup 用来解析网页的模块,在小型爬虫中具有强大作用,且简单易学。配合requests使用便可轻松爬取并解析网页
(1)原始字符r:
\n,\f,\a容易被当成字符串而不是转义字符。
(2)if,else,for语句
if+条件:
表达式/输出
{x if 条件 else y}
x,y=4,5
if x<y:
small=x
else:
small=y
small=x if x<y else y
for i in range(起始值,范围值,增加量)
not,and,or
in, not in
count 计算参数在列表中出现的次数
用一个逗号结尾就可以禁止输出换行。
print(b,end=','):1,1,2,3,5,8,
(3)数据类型,内置函数
x='小菜'
print(type(x))
除法的话如果使用/的话Python系统会默认得到浮点型的答案,而在c++中则默认整型,在Python中如果想得到整型需要使用//,除此之外还有**这个符号的新识,这个是幂符号
(4)操作符:
ord()是返回字符的编码:
print(ord('A')) 65
chr()是返回指定编码的字符:
print(chr(67)) 67
int(x,[,d])把d进制转化为十进制,或者把x返回整数
(5)Python的的输入/输出:
在python3中用input()函数时,输入的所有内容都会被当做字符串去处理,若是需要和一个数字进行比较,就会出错,所以需要用 int() 将输入的字符串转换成数字(前提是输入的本身就是个数字,否则就会报错)python3的版本里是没有raw_input()函数的,只能使用input()
列表和字典:
(列表增加)
列表名称+.+append(’需要添加的东西’)【.是范围的意思】(但是这个只能添加一个)
列表名称+.+extend([’需要添加的东西’])(一个列表扩展另一个列表)
列表名称+.+insert(数字,’需要添加的东西’)(0表示在列表最前端)
(列表删除)
列表名称+.+remove(’需要删除的东西’)
del +列表名称+【位数】(想要删除第几个就输入从零开始)
列表名称+.+pop()(括号里面如果为空,自动默认删除最后一个,)
name=列表名称.pop()(输出要删除的最后一个值)
字典:
(向字典添加一个键的同时必须添加一个值)
定义后,可以通过键来查找值,反之则不可以。
用循环语句得到字典中每个元素的键和值:
list={'severse':'ygshaj','abcde':'hsghkhw'}
for key in list.keys():
print(key,list[key])
添加/修改字典:(字典变量名[键名]=键值)
返回字典中键的数量:len()
字典检索:使用in运算符(只能查找键不能查找值)
删除:
del(删除指定键的元素或者整个字典):
del 字典名['键']
clear()(删除字典中所有元素):
字典名.clear()
pop(删除并返回指定键的元素)
字典名.pop(键名)