- 一、爬虫定义
- 网络爬虫(又被称为网页蜘蛛,网络机器人,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。
- 另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。
- 二、使用python做爬虫的好处
- 1.php 对多线程、异步支持不够好,并发处理能力很弱。爬虫是工具性程序,对速度和效率要求比较高。
- 2.Java 语言本身很笨重,代码量很大。 重构成本比较高,任何修改都会导致代码的大量变动。爬虫经常需要修改部分采集代码。
- 3.C/C++语言 运行效率和性能几乎最强,但是学习成本很高,代码成型比较慢。 能用C/C++做爬虫,只能说是能力的表现
- 4.python 语法优美、代码简洁、开发效率高、支持的模块多,相关的HTTP请求模块和HTML解析模块非常丰富。 还有强大的爬虫Scrapy框架,以及成熟高效的 scrapy-redis分布式策略
- 三、爬虫原理
- 爬虫是模拟用户在浏览器或者某个应用上的操作,把操作的过程、实现自动化的程序。来获得服务器的响应数据
- 四、HTTP的请求与响应
- 1.http会话
- 1)当用户在浏览器的地址栏中输入一个URL并按回车键之后,浏览器会向HTTP服务器发送HTTP请求。HTTP请求主要分为“Get”和“Post”两种方法。
- 2)当我们在浏览器输入URL http://www.baidu.com 的时候,浏览器发送一个Request请求去获取 http://www.baidu.com 的html文件,服务器把Response文件对象发送回给浏览器。
- 3)浏览器分析Response中的 HTML,发现其中引用了很多其他文件,比如Images文件,CSS文件,JS文件。 浏览器会自动再次发送Request去获取图片,CSS文件,或者JS文件。
- 4)当所有的文件都下载成功后,网页会根据HTML语法结构,完整的显示出来了。
- 1.http会话
- 五、cookie 和 session
- 服务器和客户端的交互仅限于请求/响应过程,结束之后便断开,在下一次请求时,服务器会认为新的客户端。
- 为了维护他们之间的链接,让服务器知道这是前一个用户发送的请求,必须在一个地方保存客户端的信息。
- Cookie:通过在 客户端(一般是浏览器) 记录的信息确定用户的身份。
- Session:通过在 服务器端 记录的信息确定用户的身份。
- 六、token
- 使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录。大概的流程是这样的:
- 1.客户端使用用户名跟密码请求登录
- 2.服务端收到请求,去验证用户名与密码
- 3.验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端
- 4.客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里
- 5.客户端每次向服务端请求资源的时候需要带着服务端签发的 Token
- 6.服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据.
- 七、urllib.request 的使用 python3
- 1.get请求
- import urllib.request
- #urlopen()函数,url是必须要传入的,data如果传入就是POST请求,如果不传就是GETT请求
- response = urllib.request.urlopen("https://www.baidu.com/")
- #服务器返回的数据,读取里面的全部内容
- response_data = response.read()
- #打印返回的数据
- print(response_data.decode("utf-8"))
- 2.post请求
- urllib.request.urlopen("http://www.baidu.com/",data="s?ie=utf-8&f=8&rsv_bp=0&rsv_idx=1&tn=baidu&wd=美女".encode("utf-8"))
- 3.Request-封装请求头信息
- from urllib.request import Request,urlopen
- headers = {"User-Agent" : "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;"}
- request = Request("http://www.atguigu.com",headers=headers)
- # request.add_headers('User-Agent','Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;') #也可以这样添加请求头
- #可以通过调用request.get_header('User-agent')来查看已有的header。 第一个字母大写,后面的全部小写,否则获取不了
- response = urlopen(request)
- #response.getcode()得到响应码
- #url = response.geturl() 返回实践数据的url,防止重定向
- # info = response.info() 返回服务器的响应报头信息
- response_data = response.read()
- print(response_data.decode("utf-8"))
- 4.随机修改user-agent 目的就是模拟不同的客户端,让服务器以为是不同的用户,不封ip
- headers = [
- "Mozilla/5.0 (Windows NT 6.1; ) Apple.... ",
- "Mozilla/5.0 (X11; CrOS i686 2268.111.0)... ",
- "Mozilla/5.0 (Macintosh; U; PPC Mac OS X.... ",
- "Mozilla/5.0 (Macintosh; Intel Mac OS... "
- ]
- user_agent = random.choice(headers)
- request.add_header("User-Agent", user_agent)
- headers = [
- 5. urllib.urlencode()
- 一般HTTP请求提交数据,需要编码成 URL编码格式,然后做为url的一部分,或者作为参数传到Request对象中。
- from urllib import parse
- #把中文转换成url编码
- wd = {"wd":"美女"}
- #需要使用urllib模块的parse函数
- urlencode = parse.urlencode(wd)
- #转换后的值:wd=%E5%B0%9A%E7%A1%85%E8%B0%B7
- print(urlencode)
- #解url编码
- decode = parse.unquote("wd=%E5%B0%9A%E7%A1%85%E8%B0%B7")
- print(decode)
- GET 方式请求 把编码后的拼接到url
- POST
- data ={"name":"zhangsan","age":"18"}
- data= urlencode(data).encode("utf-8")
- response = urllib.request.urlopen(url,data=data)
- 6. 处理HTTPS请求 SSL证书验证
- https和SSL之间是什么关系:https就是在http上面加了一层ssl协议,在http站点上部署SSL数字证书就变成了https。
- 如果SSL证书验证不通过,或者操作系统不信任服务器的安全证书,比如浏览器在访问12306网站如:https://www.12306.cn/mormhweb/的时候,会警告用户证书不受信任。(12306 网站证书是自己做的,没有通过CA认证)
- 代码在访问的时候则会报出SSLError:
- 解决方法
- import ssl
- context = ssl._create_unverified_context() #表示忽略未经核实的SSL证书认证
- ........
- response = urlopen(request,context=context)
- 1.get请求
简单爬虫入门
最新推荐文章于 2023-09-11 15:55:37 发布