spider_学习笔记01

1.爬虫简介

1.1 什么是爬虫

网络爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。

1.2 爬虫基本流程

  1. 发起请求: 使用http库向目标站点发起请求,即发送一个Request Request包含:请求头、请求体等
  2. 获取响应内容: 如果服务器能正常响应,则会得到一个Response Response包含:html,json,图片,视频等
  3. 解析内容: 解析html数据:正则表达式,第三方解析库如Beautifulsoup,pyquery等 => 解析json数据:json模块 解析二进制数据:以b的方式写入文件
  4. 保存数据: 数据库 / 文件

2.ProxyHandler处理器(代理):

  1. 代理的原理:在请求目的网站之前,先请求代理服务器,然后让代理服务器去请求目的网站,代理服务器拿到目的网站的数据后,再转发给我们的代码。

  2. httpbin.org:这个网站可以方便的查看http请求的一些参数。

  3. 在代码中使用代理:

    • 使用urllib.request.ProxyHandler,传入一个代理,这个代理是一个字典,字典的key依赖于代理服务器能够接收的类型,一般是http或者https,值是ip:port
    • 使用上一步创建的handler,以及request.build_opener创建一个opener对象。
    • 使用上一步创建的opener,调用open函数,发起请求。 示例代码如下:
 from urllib import request
 url = 'http://httpbin.org/ip'
 # 1. 使用ProxyHandler,传入代理构建一个handler
 handler = request.ProxyHandler({"http":"223.241.78.43:8010"})
 # 2. 使用上面创建的handler构建一个opener
 opener = request.build_opener(handler)
 # 3. 使用opener去发送一个请求
 resp = opener.open(url)
 print(resp.read())
复制代码

3. requests请求

发送get请求:

发送get请求,直接调用requests.get就可以了。想要发送什么类型的请求,就调用什么方法。

 response = requests.get("https://www.baidu.com/")
复制代码
response的一些属性:
 import requests
 ​
 kw = {'wd':'中国'}
 ​
 headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}
 ​
 # params 接收一个字典或者字符串的查询参数,字典类型自动转换为url编码,不需要urlencode()
 response = requests.get("http://www.baidu.com/s", params = kw, headers = headers)
 ​
 # 查看响应内容,response.text 返回的是Unicode格式的数据
 print(response.text)
 ​
 # 查看响应内容,response.content返回的字节流数据
 print(response.content)
 ​
 # 查看完整url地址
 print(response.url)
 ​
 # 查看响应头部字符编码
 print(response.encoding)
 ​
 # 查看响应码
 print(response.status_code)
复制代码
response.text和response.content的区别:
  1. response.content:这个是直接从网络上面抓取的数据。没有经过任何解码。所以是一个bytes类型。其实在硬盘上和在网络上传输的字符串都是bytes类型。
  2. response.text:这个是str的数据类型,是requests库将response.content进行解码的字符串。解码需要指定一个编码方式,requests会根据自己的猜测来判断编码的方式。所以有时候可能会猜测错误,就会导致解码产生乱码。这时候就应该使用response.content.decode('utf-8')进行手动解码。
发送post请求:

发送post请求非常简单。直接调用requests.post方法就可以了。 如果返回的是json数据。那么可以调用response.json()来将json字符串转换为字典或者列表。

使用代理:

在请求方法中,传递proxies参数就可以了。

处理cookie:

如果想要在多次请求中共享cookie。那么应该使用session。示例代码如下:

 import requests
 url = "http://www.renren.com/PLogin.do"
 data = {"email":"970138074@qq.com",'password':"pythonspider"}
 headers = {
     'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36"
 }
 ​
 session = requests.Session()
 ​
 session.post(url,data=data,headers=headers)
 ​
 response = session.get('http://www.renren.com/880151247/profile')
 with open('renren.html','w',encoding='utf-8') as fp:
     fp.write(response.text)
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享