1、基础知识
1.1 http的过程
先是在对应的浏览器里面输入url,通过浏览器来发送请求到目标服务器(url指向的服务器),目标服务会根据请求,发送回响应给浏览器,浏览器对相应进行解析。
1.1.1 请求
(1)请求方式:get()/post()
(2)请求url:url有参数,一般是在‘?’后面的是参数,有多个参数的话,通过‘&’连接起来
(3)请求头:User-Agent:最基本的反爬;Cookies:记录Session、账号以及密码等;Cotent-type:区分不同的文件信息,post请求一般会添加
(4)请求体:getq请求没有请求体,只有post请求有请求体。
1.1.2 响应
(1) 状态码:200(请求成功),3**(重定向),404(Not Found),500(Server内部错误)
(2) 响应头:set_cookies里面会包含登录后的账号密码信息
(3) 响应体:最主要的内容信息。html文件:正则表达式、BeatifulSoup、pyquery、lxml;json:json.loads();二进制的文件:保存为对应的格式
1.2 爬虫的基本概念
爬虫就是模拟浏览器获取响应,针对响应提取信息,并对提取的信息进行保存的自动化程序
(1)获取响应:通过伪装请求,来获取响应:urllib、requests、selenium(渲染库)
(2)提取信息:就是对响应体进行解析:html文件:正则表达式、BeatifulSoup、pyquery、lxml;json:json.loads();二进制的文件:保存为对应的格式
(3)保存数据:保存成文件、保存到数据库(MySQL、MongoDB)。
2、urllib(请求库)
2.1 urllib.request:进行请求
#如果data=None,就是get请求;data不为None,必须输入的是字节流(可以借助urlencode()进行转化)
(1)response=urllib.request.urlopen(url,data=None,timeout)#返回的是HTTPResponse对象
(2)urllib.request.Request(url,data=None,headers={},method='GET')#通过构建Request对象,可以构建请求的四大部分
(3)响应:
response.status#响应状态码
response.getheaders()#获取所有的响应头信息
response.getheader(name)
response.read()#获取响应的信息,返回的二进制,可以和配合decode进行编码
2.2 urllib.error#异常处理
urllib.error.URLError#总的异常,返回的是reason
urllib.error.HTTPError#http方面的异常,返回reason/code/headers
2.3 urllib.parse#解析url,或者url编码
urllib.parse.urlencode({})#可以对字典进行url编码,字典的各个部分自动通过‘&’拼接起来,返回的是字符串
urllib.parse.quote()#针对字符串进行url编码
urllib.parse.unquote()#quote()的逆方法
3.requests(请求库)
3.1 请求方式
requests.get()
requests.post()
3.2 requests.get()
response=requests.get(url,params={},headers={},timeout,cookies=RequestsCookieJar,proxies={})
#params:url的参数,字典形式
#headers:请求头,字典形式
#timeout:超时设置
#cookies:直接传入requests.cookies.RequestsCookieJar实例化对象
#proxies:代理,字典形式
3.3 响应
response.text#返回的字符串形式的响应体
response.content#返回的是二进制的响应体
response.json()#针对json格式的响应体,返回字典形式
response.status_code#返回状态码
response.headers#返回响应头
response.cookies#返回requests.cookies.RequestsCookieJar对象
requests.utils.dict_from_cookiejar(r.cookies)#将RequestsCookieJar对象转化为字典形式
3.4 requests.post()
response=requests.get(url,params={},headers={},data={},timeout,cookies=RequestsCookieJar,proxies={})
#data:请求体,字典形式
3.5 异常
requests.exceptions.RequestException #最高级的别的异常
requests.exceptions.HTTPError #HTTP方面的异常
requests.exceptions.ConnectError #连接方面的异常
requests.exceptions.Timeout#超时异常
4.正则表达式
4.1.常用的规则
\d:数字,等价于[0-9],\D
\s:空格,等价[\r\n\t],\S
[]:可以匹配中括号里面的任意字符
[^]:取反
.:除换行符以外的任意字符
*:前面符号的0个或者多个
+:前面符号的1个或者多个
?:非贪婪模式
():添加组,也用来做目标匹配
.*:贪婪模式,除换行符以外的任意字符串
.*?:非贪婪模式,除换行符以外的任意字符串
\:转义字符
4.2. re.match
re.match(r'',html,re.S|re.I)#只能从头开始匹配
#修饰符
re.S:指的是‘.’也可以指代换行符
re.I:匹配时,对大小写不敏感
4.3. re.search
re.search(r'',html,re.S|re.I)#可以从任意位置开始匹配,但是只返回匹配第一个字符串
4.4. re.findall
re.findall(r'',html,re.S|re.I)#返回所有与之匹配结果,返回的是列表形式
4.5. re.sub
re.sub(r'','',html,re.S)#替换
4.6. re.compile
re.compile(r'',re.S)#用来编译正则表达式,便于复用