爬虫基础
网页基础
HTTP请求
- url:协议://用户名:密码@子域名.域名.顶级域名: 端口号 /目录/文件名.文件后缀?参数=值#标志
- 浏览器开发者工具中network记录的http请求过程
这一个条目的各列分别代表:
- 第一列 Name,即 Request 的名称。一般会用URL的最后一部分内容当做名称。
- 第二列 Status,即 Response 的状态码。这里显示为 200,代表 Response 是正常的,通过状态码我们可以判断发送了 Request 之后是否得到了正常的 Response。
- 第三列 Type,即 Request 请求的文档类型。这里为 document,代表我们这次请求的是一个 HTML 文档,内容就是一些 HTML 代码。
- 第四列 Initiator,即请求源。用来标记 Request 是由哪个对象或进程发起的。
- 第五列 Size,即从服务器下载的文件和请求的资源大小。如果是从缓存中取得的资源则该列会显示 from cache。
- 第六列 Time,即发起 Request 到获取到 Response 所用的总时间。
- 第七列 Timeline,即网络请求的可视化瀑布流。
- 请求行
- GET 和 POST 请求方法有如下区别:
- GET 方式请求中参数是包含在 URL 里面的,数据可以在 URL 中看到,而 POST 请求的 URL 不会包含这些数据,数据都是通过表单的形式传输,会包含在 Request Body 中。
- GET 方式请求提交的数据最多只有 1024 字节,而 POST 方式没有限制。
- 所以一般来说,网站登录验证的时候,需要提交用户名密码,这里包含了敏感信息,使用GET方式请求的话密码就会暴露在URL里面,造成密码泄露,所以这里最好以POST方式发送。文件的上传时,由于文件内容比较大,也会选用POST方式。
- 头部
- Accept,请求报头域,用于指定客户端可接受哪些类型的信息。
- Accept-Language,指定客户端可接受的语言类型。
- Accept-Encoding,指定客户端可接受的内容编码。
- Host,用于指定请求资源的主机 IP 和端口号,其内容为请求 URL 的原始服务器或网关的位置。从 HTTP 1.1 版本开始,Request 必须包含此内容。
- Cookie,也常用复数形式 Cookies,
- Referer,此内容用来标识这个请求是从哪个页面发过来的,服务器可以拿到这一信息并做相应的处理,如做来源统计、做防盗链处理等。
- User-Agent,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、浏览器及版本等信息。在做爬虫时加上此信息可以伪装为浏览器,如果不加很可能会被识别出为爬虫。
- Content-Type,即 Internet Media Type,互联网媒体类型,也叫做 MIME 类型,在 HTTP 协议消息头中,使用它来表示具体请求中的媒体类型信息。例如 text/html 代表 HTML 格式,image/gif 代表 GIF 图片,application/json 代表 Json 类型
- GET 和 POST 请求方法有如下区别:
- 响应行
- Date,标识 Response 产生的时间。
- Last-Modified,指定资源的最后修改时间。
- Content-Encoding,指定 Response 内容的编码。
- Server,包含了服务器的信息,名称,版本号等。
- Content-Type,文档类型,指定了返回的数据类型是什么,如text/html 则代表返回 HTML 文档,application/x-javascript 则代表返回 JavaScript 文件,image/jpeg 则代表返回了图片。
- Set-Cookie,设置Cookie,Response Headers 中的 Set-Cookie即告诉浏览器需要将此内容放在 Cookies 中,下次请求携带 Cookies 请求。
- Expires,指定 Response 的过期时间,使用它可以控制代理服务器或浏览器将内容更新到缓存中,如果再次访问时,直接从缓存中加载,降低服务器负载,缩短加载时间。
web网页基础
网页的组成
网页可以分为三大部分,HTML、CSS、JavaScript,我们把网页比作一个人的话,HTML 相当于骨架,JavaScript 则相当于肌肉,CSS 则相当于皮肤html基础
HTML文档就是一系列的Tag组成,最外层的Tag是
<html>
。规范的HTML也包含<head>...</head>
和<body>...</body>
(注意不要和HTTP的Header、Body搞混了),由于HTML是富文档模型,所以,还有一系列的Tag用来表示链接、图片、表格、表单等等。CSS选择器
选择器 | 示例 | 示例说明 | CSS |
---|---|---|---|
.class | .intro | 选择所有class=”intro”的元素 | 1 |
#id | firstname | 选择所有id=”firstname”的元素 | 1 |
* | * | 选择所有元素 | 2 |
element | p | 选择所有元素 | 1 |
element,element | div,p | 选择所有元素和元素 | 1 |
element element | div p | 选择元素内的所有元素 | 1 |
1. 我们在页面的哪个位置点击审查元素,浏览器就会为我们定位到相应的HTML位置,进而就可以在本地更改HTML信息:可以修改本地显示的网络页面,密码的查看 type=’password’->’text’
基本库的使用
请求库
基本方法
get方法
- 参数
- url
- header:头部信息
- params:传递url参数
- timeout 超时设置
- proxies 代理设置
- auth 身份验证
- 返回的对象
- .txet 响应内容,一般为html文件
- .content 二进制响应内容
- .json( ) 处理json数据
- .status_code 响应状态码
- .header 响应头
- .cookies
- 参数
post方法
- 参数
- url
- data 在表单中提交数据
- files 提交文件
- 参数
会话对象
1. with requests.Session() as s: s.get('http://httpbin.org/cookies/set/sessioncookie/123456789') 2. s = requests.Session() s.auth = ('user', 'pass') s.headers.update({'x-test': 'true'}) s.get('http://httpbin.org/headers', headers={'x-test2': 'true'})
准备的请求
from requests import Request, Session s = Session() req = Request('GET', url, data=data headers=headers ) prepped = s.prepare_request(req) s.send(prepped)
解析库
解析
soup=Beautifulsoup(html,'lxml')
将html文件解析为soup对象
标签选择
通过soup.标签名,我们就可以获得这个标签的内容 这里有个问题需要注意,通过这种方式获取标签,如果文档中有多个这样的标签,返回的结果是第一个标签的内容,如上面我们通过soup.p获取p标签,而文档中有多个p标签,但是只返回了第一个p标签内容
获取内容
- 获取名称 soup.tag.name
- 获取属性 soup.tag.attrs soup.tag.attrs[‘attr’]/soup.tag[‘attr’]
- 获取内容 soup.tag.string/text
嵌套选择
soup.tag1.tag2
子节点和子孙节点
soup.p.contents
结果是将p标签下的所有子标签存入到了一个列表中
children
通过上面的方式也可以获取p标签下的所有子节点内容和通过contents获取的结果是一样的,但是不同的地方是soup.p.children是一个迭代对象,而不是列表,只能通过循环的方式获取素有的信息
descendants
通过contents以及children都是获取子节点,如果想要获取子孙节点可以通过descendants
其他节点选择器
- 通过soup.a.parent就可以获取父节点的信息
- 通过list(enumerate(soup.a.parents))可以获取祖先节点,这个方法返回的结果是一个列表,会分别将a标签的父节点的信息存放到列表中,以及父节点的父节点也放到列表中,并且最后还会讲整个文档放到列表中,所有列表的最后一个元素以及倒数第二个元素都是存的整个文档的信息
- soup.a.next_siblings 获取后面的兄弟节点
- soup.a.previous_siblings 获取前面的兄弟节点
- soup.a.next_sibling 获取下一个兄弟标签
- soup.a.previous_sinbling 获取上一个兄弟标签
标准选择器
find_all
find_all(name,attrs,recursive,text,**kwargs) 可以根据标签名,属性,内容查找文档
name
soup.find_all('name1' )
返回列表,包含所有的tag名为name1的内容
from bs4 import BeautifulSoupsoup = BeautifulSoup(html, 'lxml') print(soup.find_all('ul')) for ul in soup.find_all('ul'): print(ul.find_all('li'))
同时我们是可以针对结果再次find_all,从而获取所有的li标签信息
attrs
attrs可以传入字典的方式来查找标签,但是这里有个特殊的就是class,因为class在python中是特殊的字段,所以如果想要查找class相关的可以更改attrs={‘class_’:’element’}或者soup.find_all(”,{“class”:”element}),特殊的标签属性可以不写attrs
text
from
bs4 ``import
BeautifulSoupsoup ``=
BeautifulSoup(html, ``'lxml'``)
print``(soup.find_all(text``=``'Foo'``))
结果返回的是查到的所有的text=’Foo’的文本
其他
find
find(name,attrs,recursive,text,**kwargs)
find返回的匹配结果的第一个元素
其他一些类似的用法:
find_parents()返回所有祖先节点,find_parent()返回直接父节点。
find_next_siblings()返回后面所有兄弟节点,find_next_sibling()返回后面第一个兄弟节点。
find_previous_siblings()返回前面所有兄弟节点,find_previous_sibling()返回前面第一个兄弟节点。
find_all_next()返回节点后所有符合条件的节点, find_next()返回第一个符合条件的节点
find_all_previous()返回节点后所有符合条件的节点, find_previous()返回第一个符合条件的节点
CSS 选择器
通过select()直接传入CSS选择器就可以完成选择
- 选择参数
- .表示class #表示id
- 标签1,标签2 找到所有的标签1和标签2
- 标签1 标签2 找到标签1内部的所有的标签2
- [attr] 可以通过这种方法找到具有某个属性的所有标签 [atrr=value] 例子[target=_blank]表示查找所有target=_blank的标签
获取内容
- 通过get_text()就可以获取文本内容
- 获取属性的时候可以通过[属性名]或者attrs[属性名]