第七课:爬虫基本原理讲解-(崔庆才_Python3爬虫入门到精通课程视频 34课)总结

爬虫就是请求网站并提取数据的自动化程序,学程序模拟浏览器请求服务器,从html文本内提取我们想要的信息,存到数据库或本地。

爬虫工作原理

爬虫基本流程:四部曲,

第一步,发起请求,通过http库向目标站发起请求,即发送一个request,请求可以包含额外的headers等信息,等待服务器响应,

第二步,获取响应内容,如果服务器能正常响应,会得到一个response,response的内容便是所要获取的页面内容,类型可能有html,json字符串,二进制数据(如图片视频)等类型,

第三步,解析内容,得到的内容可能是html,可以用正则表达式,网页解析库进行解析。可能是json,可以直接转为json对象解析,可能是二进制数据,可以做保存或者进一步的处理。

第四步,把提取出来的数据结构化的保存存储,保存形式多样,可以存为字典,文本,图片,视频,也可以保存至数据库,或者保存特定格式的文件。

什么是request和response?即请求和响应,request headers解析头的信息,response headers响应头的信息,response响应的内容

第一步,浏览器就发送消息给该网址所在的服务器,这个过程叫做HTTP Request

第二步,服务器收到浏览器发送的消息后,能够根据浏览器发送的消息的内容,做相应处理,然后把消息回传给浏览器,这个过程叫做HTTP Response

第三步,最后一步,浏览器收到服务器的response信息后,会对信息进行处理,然后展示。

Request中包含什么?包含4个部分,第一,请求方式,get和post两类,另外还要HEAD/PUT/DELETE/OPTIONSDS等,

Request Method: GET或者Request Method: POST

POST请求多了一个Form Data表单

GET请求是把一下参数放到了url后面,GET请求可以直接输入UEL访问,

POST请求需要构造一个Form Data表单,点击表单提交才可以构建POST请求,就像点击登录窗口一样才能构建一个POST请求。

第二,请求的URL,全称统一资源定位符,一个网页文档,一张图片,一个视频等都可以用URL唯一来确定。

第三,请求头信息,包含请求时的头部信息,如User-Agent、Host、Cookies等信息。(写爬虫时候要写Request Headers)

第四,请求体,POST请求才有Form Data表单,加载在请求体中,General、request headers整体发送给服务器,

Response中包含什么?包含三个信息,第一,响应状态,有多种响应状态,200代表成功,301跳转,404找不到页面,502服务器错误。

第二,响应头,如内容类型,内容长度,服务器信息,设置cookie等等

第三,响应体,最主要的部分,包含了请求资源的内容,如网页HTML、图片、二进制数据等。

举例:cmd命令下输入python3进入交互模式,导入包import requests回车,http请求库,用来最模拟请求的,调用requests.get的方法,即输入response = requests.get('http://www.baidu.com')通过这两行代码就完成了http请求的发送拿到了这个响应,再输入打印源代码print(response.text)回车,可以再输入响应头print(response.headers)回车,再输入打印状态码print(response.status_code)回车,再输入请求头headers = {}回车,再输入headers = {‘User-Agent‘:‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36’}回车,再输入response = requests.get('http://www.baidu.com', headers=headers)回车,把headers当headers传过来,这次请求携带了headers信息,输出打印状态码print(response.status_code)回车。

能抓怎样的数据?第一,网页文本,如html文档,ajax请求json格式文本等,

第二,获取二进制文件,保持为图片格式,例如交互模式下输入response = requests.get('https://www.baidu.com/img/bd_logo1.png')回车,然后打印输出print(response.content)回车,(content方法就是获取了响应体的二进制格式),再次调用python写入的方法,输入with open('/Python39/1.png', 'wb') as f:回车(第一个参数‘/Python39/1.png’输入图片的存储位置和名称参数写过来,第二个‘wb’参数图片写入的模式),再输入f.write(response.content)回车,再输入f.close()回车,看到返回。

第三,获取同为二进制文件,保存为视频格式即可.

第四,其他的格式,只要是能请求到的,都能获取。

怎么来解析?解析方式,第一,直接处理;第二,json解析;

 

 如果是json格式字符串,通过ajax加载的,直接解析json格式就可以拿出来。第三,正则表达式,提取方式,规则字符串把一些html代码里面的相应文本提取出来;第四,BeautifulSoup解析库来解析,比正则表达式更好用,提取也更加容易;第五,PyQuery解析库来解析;第六,XPath解析库来解析。看情况选择使用。

为什么我抓到的和浏览器看到的不一样?因为浏览器都是js加载后看到的源代码,跟我们一开始后台请求的源代码不一样的。举例:微博m.weibo.cn进入cmd命令输入python3进入交互模式,导入包import requests输入requests.get(‘http://m.weibo.cn’)回车,再输入requests.get(‘http://m.weibo.com’).text回车,看到用库请求的源代码结果了(不是浏览器js加载完看到的源代码)。

怎么解决JavaScript渲染的问题?第一,分析Ajax请求,ajax返回的是一些json字符串,方便我们提取数据;第二,用Selenium、WebDriver去用这么个浏览器模拟加载网页,自动化测试工具,举例python交互模式下导入包from selenium import webdriver回车,声明浏览器对象,接着输入 driver = webdriver.Chrome()回车,用get方法传入网址,即输入driver.get(‘http://m.weibo.com’)回车就访问了微博,接着访问淘宝输入driver.get('http://www.taobao.com')回车,拿ajax的数据输入print(driver.page_source)就可以提取需要的数据了,就不用担心JavaScript渲染的问题了。第三,Splash库,也是像selenium库已有,也是模拟JavaScript渲染的,https://github.com/官网搜索splash(此处略过)。第四,PyV8、Ghost.py另外一些库模拟下载js。

可以怎样保存数据?第一,保存纯文本/json/xml等;第二,关系型数据库,如MySQL/oracle/sql server等具有结构化表结构形式存储;第三,非关系型数据库存储,如MongoDB/Redis等Key-Value形式存储。DataGrip演示。第四,二进制文件存储,如图片/视频/音频/等等直接保存成特定格式即可。

posted @ 2020-12-27 22:51  李俊鹏Python  阅读(490)  评论(0编辑  收藏  举报