Hello,I’m Python
python 爬虫的好处
Python:语法优美,语法简洁,开发效率高,而且Python有很多第三方库 , 对多任务的支持也比较友好,并且有成熟的scrapy爬虫框架和sacrpy-redis分布式策略
爬虫流程
- 确定目标网站的url
- 发起请求,获取响应
- 提取数据
- 判断是否需要跟进
- 提取新的url,执行第二步循环
分类
- 通用爬虫
- 一般是搜索引擎的重要组成部分,尽可能的爬取全网的数据,并将页面进行本地存储,处理
- 缺点:
- 需要遵守REBOT协议,有些路径不允许访问
- 只能够爬去简单的文字,并不支持二进制
- 不能够根据不同用户返回不同的结果
- 返回的是全部页面,有很多信息用不到
- 聚焦爬虫
- 有目的姓的爬取网页的数据
常见状态码
-
100~199:表示服务器成功接收部分请求,要求客户端继续提交其余请求才能完成整个处理过程。
-
2xx:表示服务器成功接收请求并已完成整个处理过程。
- 200(OK 请求成功)。
-
3xx:为完成请求,客户需进一步细化请求。例如:请求的资源已经移动一个新地址、 常用
- 301: 永久重定向
- 302:临时重定向(所请求的页面已经临时转移至新的url)
-
4xx:客户端的请求有错误.
- 400:错误请求,服务器无法解析请求
- 401:未授权,没有进行身份验证
- 403:服务器拒绝访问
- 404:服务器无法找到被请求的网页
- 408:请求超时
-
5xx:服务器端出现错误
- 500:服务器内部错误
- 501:服务器不具备完成请求的功能
- 503:服务器不可用
urllib 携带参数
import urllib.request as request
import urllib.parse as parse
# 使用urlencode()方法,将参数转换为url编码格式
data = {
'wd':'美女'
}
aa = parse.urlencode(data)
ful = 'http://www.baidu.com/s?'+ aa
response = request.urlopen(ful)
# 获取页面二进制数据
response.read()
# 获取响应头
response.getheaders()
# 解码
# 二进制--->>字符串
decode()
# 编码
# 字符串----->>二进制
encode()
# 如果要将转换编码格式 需要先解码 在编码
构建Request对象
from urllib import request
headers = {
'User-Agent':'dddsdsfdf',
'Refer':'',
'Cookie':''
}
# request.Request()的参数:
# url -->目标url
# data --> 有数据表示POST请求
# headers --> 请求参数
# method---> 请求方法
req = request.Request(url='',headers='',)
response=request.urlopen(req)
Post 请求
在python的urllib 模块中,Post请求的数据需要转码。栗:
from urllib import parse
data = {
'name':'张三',
'age':2,
'sex':'男/女'
}
from_data = parse.urlencode(data).encode("utf-8")
req = requset.Request(url='',headers='',data=from_data)
response = request.urlopen(req)
注意:在urllib 模块中,如果Request对象没有data参数,是Get请求;有data参数,就是Post请求
附上简单栗子
from urllib import request
from urllib import parse
def main():
# 请求头
header={
'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
}
for i in range(11):
data = {
'kw': '美女',
'pn': (int(i) - 1) * 50
}
data = parse.urlencode(data)
# 构建url
url = 'https://tieba.baidu.com/f?'+data
req = request.Request(url=url,headers=header)
response = request.urlopen(req)
# 将二进制转换utf-8格式
html = response.read().decode('utf-8')
# print(html
print('写入'+str(i)+'页')
# 存入本地
with open('page'+str(0000)+'.html','w') as f:
f.write(html)
if __name__ == '__main__':
main()