python爬虫(一)

 

爬虫

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

cookies是什么?

cookies存储在客户端,被称为浏览器 cookie 或跟踪 cookies,cookies 是一种小型的,经常加密的文本文件,位于浏览器目录中。当用户的浏览器加载特定网站时,Cookies 就会被创建。 网站将信息发送到浏览器,然后创建文本文件。 每次用户回到同一个网站,浏览器就会检索并将这个文件发送到网站的服务器上。网站服务器设置 cookies 以帮助验证用户,如果用户登录到一个安全区域的网站。 登录信息存储在 cookie 中,这样用户就可以进入和离开网站,而无需重复输入相同的身份验证信息。

session是什么?

session存储在服务器端,,我们知道,我们用浏览器打开一个网页,用到的是HTTP协议,学过计算机的应该都知道这个协议,它是无状态的,什么是无状态呢?就是说这一次请求和上一次请求是没有任何关系的,互不认识的,没有关联的。但是这种无状态的的好处是快速。当用户登录后,需要把用户信息保存到session中,便于确保用户操作权限,在其它页面通过检查session是否为null可以知道用户是否登录。

 

http定义的与服务器交互的几种方法:
get 仅仅获取资源的信息,不增加或者修改数据。
post 一般丢该服务器上的资源,一般我们通过form表单进行提交请求
put 增加
delete 删除

用法如下:

import requests
requests.get("http://www.baidu.com")
requests.post("http://www.jd.com")
requests.put("http://www.jd.com")
requests.delete("http://www.jd.com")

 

传递参数

get方式

params = {'key1': 'hello', 'key2': 'world'}
url = 'https://www.jd.com'
r = requests.get(url=url, params=params)  # 使用get方式传递参数
r.encoding=r.apparent_encoding  # 解决中文乱码问题
print(r.url)

结果:
https://www.jd.com/?key1=hello&key2=world

我们也可以直接使用如下格式
requests.get('https://www.jd.com/?key1=hello&key2=world')

post方式

params = {'key1': 'hello', 'key2': 'world'}
r = requests.post("http://httpbin.org/post", data=params)  # 使用post方式传递参数
print(r.text)

http://httpbin.org/post是requests提供的官网地址,通过json的方式给大家返回。可以看到我们返回的数据。Post的数据参数是data,都是字典的类型,但是urllib就没法接受字典类型,必须是字符串.
结果:
{
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {
    "key1": "hello", 
    "key2": "world"
  }, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Connection": "close", 
    "Content-Length": "21", 
    "Content-Type": "application/x-www-form-urlencoded", 
    "Host": "httpbin.org", 
    "User-Agent": "python-requests/2.18.4"
  }, 
  "json": null, 
  "origin": "1.202.119.5", 
  "url": "http://httpbin.org/post"
}

 

响应http的请求

url = 'https://www.qiushibaike.com/'
r = requests.get(url=url)
print(r.text)
print(r.encoding) # 查看编码

print(type(r.text))        # <class 'str'>
print(type(r.content))    # <class 'bytes'>

Requests中text和content的区别是什么
r.text返回的是str类型的数据。
r.content返回的是bytes型也就是二进制的数据。
也就是说,如果你想取文本,可以通过r.text。
如果想取图片,文件,则可以通过r.content。

 

Request的其他常用方法

header = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 Safari/537.36'}
r = requests.get('https://www.qiushibaike.com/', headers=header)
print(r.text)        # 文本
print(r.request)    # <PreparedRequest [GET]>
print(r.headers)    # 查看headers里面的信息
# {'Server': 'openresty', 'Date': 'Wed, 13 Jun 2018 00:45:18 GMT', 'Content-Type': 'text/html; charset=UTF-8', 'Content-Length': '17262', 'Connection': 'keep-alive', 'Content-Encoding': 'gzip', 'Set-Cookie': '_xsrf=2|c507eecf|ae629d57d463c6463e2a1cc9f1e08b29|1528850718; Path=/', 'Vary': 'User-Agent, Accept-Encoding', 'Etag': '"6f919c12f4ca4cbd302750607717ef3cfb69888f"'}
print(r.cookies)             #  cookies的信息
print(r.cookies['_xsrf'])     #  可以通过字典的方式取值  2|b52260a2|df5eb7b56a7285dd52fce5041c1d83ec|1528850951
print(r.url)                 #  请求的url是多少  https://www.qiushibaike.com/
print(r.status_code)         #  http的状态返回码  200

 

Request更改请求头信息

header = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 Safari/537.36'}
r = requests.get('https://www.qiushibaike.com/', headers=header)
print(r.text)
print(r.headers)

既然我们可以对header信息进行更改,那么为了防止反爬虫操作,我们可以通过定义一个list,然后再通过random模块随机取一个header信息进行访问。
流行浏览器的user-agent参考:https://blog.csdn.net/zhengqijun_/article/details/80207496

 

Request的会话对象

Python2   
S = requests.Session()

Python3
s = requests.session()

一次会话的所有信息都保存在s中,只需要对s进行操作就可以了。
s.get(url)

 

Requests通过会话信息来获取cookie信息
Cookie的五要素:
Name value domain path expires

import requests

def save_cookie():
    s = requests.session()
    s.get('https://www.hao123.com/')
    print(s.cookies)
    print(s.cookies.keys())
    print(s.cookies.values())
    for i in s.cookies:
        print(i)
    print(i.name, i.value, i.domain, i.path, i.expires)
save_cookie()

结果:
<RequestsCookieJar[<Cookie BAIDUID=3B72F56E3AC1DBE36501A4C8AEE5E1E1:FG=1 for .hao123.com/>, <Cookie __bsi=11962264801410047351_00_51_N_N_117_0303_c02f_Y for .www.hao123.com/>, <Cookie hz=0 for .www.hao123.com/>, <Cookie ft=1 for www.hao123.com/>, <Cookie v_pg=normal for www.hao123.com/>]>
['BAIDUID', '__bsi', 'hz', 'ft', 'v_pg']
['3B72F56E3AC1DBE36501A4C8AEE5E1E1:FG=1', '11962264801410047351_00_51_N_N_117_0303_c02f_Y', '0', '1', 'normal']
<Cookie BAIDUID=3B72F56E3AC1DBE36501A4C8AEE5E1E1:FG=1 for .hao123.com/>
<Cookie __bsi=11962264801410047351_00_51_N_N_117_0303_c02f_Y for .www.hao123.com/>
<Cookie hz=0 for .www.hao123.com/>
<Cookie ft=1 for www.hao123.com/>
<Cookie v_pg=normal for www.hao123.com/>
v_pg normal www.hao123.com / None

 

Cookie的常用属性

1. Domain 域
2. Path 路径
3. Expires 过期时间
4. name 对应的key值
5. value key对应的value值
cookie中的domain代表的是cookie所在的域,默认情况下就是请求的域名,例如请求http://www.server1.com/files/hello, 那么响应中的set-Cookie默认会使用www.server1.com作为cookie的domain,在浏览器中也是按照domain来组织cookie的。 我们可以在响应中设置cookie的domain为其他域,但是浏览器并不会去保存这些domain为其他域的cookie。
cookie中的path能够进一步的控制cookie的访问,当path=/; 当前域的所有请求都可以访问到这个cookie。 如果path设为其他值,比如path=/test,那么只有/test下面的请求可以访问到这个cookie。

 

使用已知cookie信息,如何访问网站

url = 'http://httpbin.org/cookies'
r = requests.get(url, cookies={'key1': 'value1', 'key2': 'value2'})
print(r.text)

结果:
{
  "cookies": {
    "key1": "value1", 
    "key2": "value2"
  }
}

 

代理访问

采集时为避免被封IP,经常会使用代理。requests也有相应的proxies属性。例如:西刺代理。

import requests
proxies = {
  "http": "http://182.108.5.246:8118",
  # "https": "http://112.117.184.219:9999",
}
r1 = requests.get("http://2017.ip138.com/ic.asp", proxies=proxies)
r2 = requests.get("http://2017.ip138.com/ic.asp")
print(r1.text)
print(r2.text)
[182.108.5.246]
[106.38.115.34]
如果代理需要账户和密码,则需这样:
proxies = {
    "http": "http://user:pass@10.10.1.10:3128/",
}

 

总结

Requests给你提供的所有接口,在传输数据的时候,都可以以key:value的形式进行传输。
如果你使用urllib,那么你就没有这么幸运了,很多事情都需要你自己去处理,并不可以直接通过dict的形式进行传输,需要进行转换。

 

posted @ 2018-06-13 20:42  quartzite  阅读(268)  评论(0编辑  收藏  举报