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的编码