爬虫 1

1.爬虫的介绍


​    
爬虫的比喻:

​        互联网就像一张蜘蛛网,爬虫相当于蜘蛛,数据相当于猎物

​    爬虫的具体定义:

​        模拟浏览器向后端发送请求,获取数据,解析并且获得我想要的数据,然后存储

​    爬虫的价值:

​        数据的价值


流程:发送请求--获得数据--解析数据--存储数据

常用的解析模块:bs4,pyquery,re

 

2.html协议里需要关注的

请求:

​    URL:指明了我要去哪里

​    method:

​        GET:

​            传递数据:?&拼在url后面

​        post:

​            请求体:

​                formdata

​                files

​                json

​    请求头:

​        Cookie:

​        Referer:告诉服务器你从哪里来

​        User-Agent:告诉服务器你的身份



响应:

​    **Status Code**:

​        2xx:成功

​        3xx:重定向

​    响应头:

​        **location**:跳转地址

​        set_cookie:设置cookie

​    响应体:

​        1.html代码

​        2.二进制:图片,视频,音乐

​        3.json格式

 

3、 常用请求库、解析库、数据库的用法

3.1 常用请求库    测试网站:http://httpbin.org/

需要注意,get请求时,路径为 http://httpbin.org/get
post请求时,路径为http://httpbin.org/post
因为这两种不同的url后的参数对相对应的请求的数据做了处理

安装 request库  : pip install requests


3.2请求:

3.2.1 get请求:

    响应对象 = requests.get(......)

**参数:**

url:            

headers = {}       优先级高于cookie

cookies = {}   

params = {}        url里也可以自带参数

proxies = {'http':‘http://端口:ip’}  # 代理ip

timeout = 0.5    # 超时时间

allow_redirects = False   # 允许重定向与否



3.2.2 post请求   

    
响应对象 = requests.post(......)

**参数:**  与get请求类似

url:

headers = {}    

cookies = {}    用来去验证

data = {}    

json = {}

files = {‘file’:open(...,‘rb’)}

timeout = 0.5

allow_redirects = False

 

3.3 自动保存cookie

3.3.1 生成cookie

session = requests.session()  产生session对象
第一次发送请求后,将cookie值保存

r = session.get(......)
r = session.post(......)
session.get(url=url1)
session.post(url=url1)



url2 = 'http://www.lagou.com'
url3 = 'https://www.taobao.com'

r = session.get(url=url2)
print(1.1,r.cookies)
print(1.2,session.cookies)

r = session.get(url=url3)
print(2.1,r.cookies)
print(2.2,session.cookies)


以下为结果,即r.cookies拿到的是当前网页的cookies,
session.cookies是session对象里所存在的所有的cookies.

.1 <RequestsCookieJar[<Cookie JSESSIONID=ABAAABAAADEAAFI8681BFC6C41A8E717C15FDB51B6E2CB8 for www.lagou.com/>]>
1.2 <RequestsCookieJar[<Cookie JSESSIONID=ABAAABAAADEAAFI8681BFC6C41A8E717C15FDB51B6E2CB8 for www.lagou.com/>]>
2.1 <RequestsCookieJar[<Cookie thw=cn for .taobao.com/>]>
2.2 <RequestsCookieJar[<Cookie thw=cn for .taobao.com/>, <Cookie JSESSIONID=ABAAABAAADEAAFI8681BFC6C41A8E717C15FDB51B6E2CB8 for www.lagou.com/>]>

 

3.3.2 保存cookie

import http.cookiejar as cooklib
url2 = 'http://www.lagou.com'
url3 = 'https://www.github.com'

session = requests.session()     # RequestsCookieJar  没有save方法
print(type(session.cookies))   # <class 'requests.cookies.RequestsCookieJar'>

#为了本地保存cookies  需要使用导入的cooklib,产生一个新的对象
session.cookies = cooklib.LWPCookieJar()    # 这个对象自身有save方法
print(type(session.cookies))    # <class 'http.cookiejar.LWPCookieJar'>

r = session.get(url=url3)
session.cookies.save(filename='1.txt')  # 自动将生成的cookies存到  1.txt文件里

 

3.3.3 取出cookie


import http.cookiejar as cooklib
url2 = 'http://www.lagou.com'
session = requests.session()
session.cookies = cooklib.LWPCookieJar()
# 将之前保存的cookies取出,加载
session.cookies.load(filename='1.txt')

session.get(url=url2)
print(session.cookies)
# 以下为结果,将已存在的和这次操作的cookies都取出来
# <LWPCookieJar[
# <Cookie _octo=GH1.1.1788136135.1565085874 for .github.com/>,
# <Cookie logged_in=no for .github.com/>,
# <Cookie has_recent_activity=1 for github.com/>, 
# <Cookie JSESSIONID=ABAAABAAAIAACBI3C2BB81B972E645113570999880404A8 for www.lagou.com/>
# ]>

 

4. 响应

r.url  

r.text     拿到文本内容加上对应的标签

request.encoding 的默认编码格式是  ISO-8859-1
r.encoding = 'gbk'  解决乱码的问题方式,将其默认的编码格式改变,针对r.text而言
查看所爬web的编码格式,在web检查下的控制台输入 document.charset即可!

r.content    二进制文件  可以通过添加decode('') 将其转变成正常的数据

r.json()  记得带括号 拿到json格式的数据
处理方式一:
import json
print(type(r.text))     <class 'str'>
print(type(json.loads(r.text)))    <class 'dict'>
处理方式二:
print(r.json())   直接使用requests内部的json()的方法

需要注意,前端爬过来的数据应该是json格式的字符串,如果是其他的html数据,会报错!!!

r.status_code   状态吗

r.headers    响应头
 
r.cookies

r.history    # 重定向相关 即拿到 [<Response [301]>]

 

5.常用解析语法

### css选择器
1、类选择器                 .类名

​    2、id选择器                #id值
3、标签选择器         标签名

​    4、后代选择器      选择器1 选择器2

​    5、子选择器       选择器1>选择器2

​    6、属性选择器  

                             [属性]   有这个属性的标签

​                            [属性=值1]  有这个属性且值=1

​                            [属性^=值]   以值开头

​                            [属性$=值]   以值结尾 

​                            [属性*=值]    包含该值



​    7、群组选择器     选择器 1,选择器 2    之间用逗号隔开

​    8、多条件选择器     选择器1选择器2       即之间不分开


xpath选择器
  使用差不多

 

6.request-html模块


安装 : pip install request-html


使用:

from requests_html import HTMLSession

session = HTMLSession()    # 同样是产生一个session对象



响应对象 = session.request(......,method='')

响应对象 = session.get(......)

响应对象 = session.post(......)



属性和request模块式一样的

 

 

html对象属性


request-html 和 request  的区别在于 前者可以对html页面进行解析

r.html.absolute_links    # 将所爬web里的相对路径变为绝对路径
同时结果为集合,完成数据的去重,同时拿到绝对路径

.links   输出原样的链接,相对路径还是相对

.base_url   基本链接

.html        html文件

.text     拿到所有的文本内容    很好用

.encoding = 'gbk'    解决r.html.html的编码问题

.raw_html   获得二进制数据流,原生的传输过来的数据,可以通过decode转变

.pq     产生的是pquery对象


注:r.encoding() 控制的是r.text的编码

 

posted on 2019-08-06 20:53  michael-chang  阅读(188)  评论(0)    收藏  举报

导航