python爬虫[笔记记录一]

python爬虫[笔记记录一]
python爬虫[笔记记录二]

爬虫的定义:
网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。(来自百科)

我的环境:python3.7.1
没有什么过多的原理,主要是代码
先介绍下面两个模块,分别是requests、beautifulsoup4,如果你要看selenium,请看python爬虫[笔记记录二]

导航

requests模块

简单介绍:

Requests 是用Python语言编写,基于 urllib3,采用 Apache2 Licensed 开源协议的 HTTP 库。它比 urllib 更加方便,可以节约我们大量的工作,完全满足 HTTP 测试需求,它是一个Python第三方库,处理URL资源特别方便。使用 Requests 发送网络请求非常简单。Requests 支持 Python 2.6—2.7以及3.3—3.7,而且能在 PyPy 下完美运行。

配置requests模块:

首先安装:

1
pip3 install requests

导入模块:

1
import requests

requests库常见的几种方法:

准确的来说应该是8种方法,你可以在下面这个文件里面看到

在 你的python目录/python3.7/site-packages/requests/api.py 文件里面可以看到下方的8种常见方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
requests.request('method','https://smelond.com/method') # 下面所有方法都会用到这个request,具体可以看api.py源代码

requests.get('https://smelond.com/index.php') #GET请求

requests.post('https://smelond.com/post') #POST请求

requests.put('https://smelond.com/put') #PUT请求(提交修改全部的数据)

requests.delete('https://smelond.com/delete') #DELETE请求

requests.head('https://smelond.com/get') #HEAD请求

requests.patch('https://smelond.com/get') #PATCH请求(提交修改部分数据)

requests.options('https://smelond.com/options') #用于获取目的资源所支持的通信选项

本文主要讨论的是get、post、put

get 方法:

GET 方法请求指定的资源。使用 GET 的请求应该只用于获取数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import requests
result = requests.get('https://smelond.com/index.php') # GET请求,获取result的一个Response 对象
print(result) # Response 对象
print(result.url) # 打印当前url
print(result.text) # 获取返回的源代码
print(result.content) # 获取返回的源代码 字符串是bytes 类型
print(result.cookies) # 打印当前的cookies,他返回的是一个RequestCookieJar的实例,像一个字典
print(requests.utils.dict_from_cookiejar(result.cookies)) # 以字典方式显示这个cookie
print(tuple(result.cookies))
print(result.headers) # 打印当前的headers信息
print(result.encoding) # 打印当前的网站编码(UTF-8、ISO-8859-1)
print(result.elapsed) # 获取响应时间
print(result.history) # 获取请求历史
print(result.raw) # 获取来自服务器的原始套接字,他是一个类
print(result.raw.read(10)) # 获取来自服务器的原始套接字
print(result.reason) # 返回响应,没有这个页面就返回一个Not Found,有就返回OK
print(result.status_code) # 获取返回的状态码

post 方法:

POST 方法 发送数据给服务器. 请求主体的类型由 Content-Type 首部指定。

1
2
3
4
5
6
7
8
9
10
11

import json,requests
data = {
'username': 'admin',
'password': '123456'
}
request_conn = requests.Session() #用session对象发出get请求,设置cookies,这样当我们第二次去访问需要登录的url链接时就不会要求重新登录
result = request_conn.post('https://smelond.com/login.php',data=data) # 发送一个post请求数据登录包
result = request_conn.post('https://smelond.com/login.php',data=json.dumps(data)) # 发送一个json请求数据登录包
result = request_conn.post('https://smelond.com/login.php',json=data) # 发送一个json请求数据登录包,json参数会自动将字典类型的对象转换为json格式
其他方法与get类似

put 方法:

PUT 用于新增资源或者使用请求中的有效负载替换目标资源的表现形式。

1
2
3
4
import requests

result = requests.put('https://smelond.com/up.txt', data=open('123.txt', 'rb').read()) # 读取文件内容,上传到url的up.txt文件
print(result.status_code) # 打印状态码,可以根据状态码或其他的内容判断是否上传成功

请求时可携带的其他参数:

他们也是一些requests的高级用法
在 /python3.7/site-packages/requests/sessions.py 第466行可以看到
这些参数几乎对每一个方法都通用,他们分别是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
> * params 			把参数加到url后面
> * data 字典,提交一个post请求
> * headers 字典,HTTP定制头
> * cookies 字典,携带cookie访问
> * files 字典,传输文件
> * auth 元组,支持HTTP认证功能,具体可以产考(http://docs.python-requests.org/zh_CN/latest/user/authentication.html)
> * timeout 数字,设置访问超时时间
> * allow_redirects bool,重定向
> * proxies 字典,设置代理访问,支持http、https、socks5
> * hooks 字典,事件挂钩
> * stream bool,响应体内容工作流(当使用requests进行下载时,可使用这个参数)
> * verify [bool,本地证书路径],SSL 证书验证
> * cert 元组,客户端证书
> * json 字典,提交一个json请求

具体可以查看文档:python高级用法 传送门


beautifulsoup4模块

简单介绍

Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式。Beautiful Soup库是解析、遍历、维护“标签树”的功能库。

配置beautifulsoup4模块

首先安装:

1
pip3 install beautifulsoup4

导入模块:

1
from bs4 import BeautifulSoup

ta有一个内置解析器html.parser
他还有几个解析器:

1
2
3
pip3 install xml
pip3 install lxml
pip3 install html5lib

html5lib的解析方式与浏览器相同

基本用法

假设我现在的网站为https://smelond.com/ 那么在没有修改任何服务器配置情况下,他的主页默认可能会为index.html,所以requests默认访问的就是index.html
index.html 文件内容为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>BeautifulSoup4</title>
</head>
<body>
<div>
<a href="https://qq.com" class="v">qq</a>
<a href="https://www.sina.com" class="v">sina</a>
<a href="https://www.baidu.com" class="v">baidu</a>
<p class="123">test<p>
</div>
</body>
</html>

基本操作,获取页面内容

1
2
3
4
5
6
7
from bs4 import BeautifulSoup   # 导入BeautifulSoup4

result_content = requests.get('https://smelond.com/') # 获取网站内容
if int(result_content.status_code) < 400: # 判断返回状态码
result_content.encoding = 'utf-8' # 设置编码类型
soup = BeautifulSoup(str(result_content.text), 'html.parser') # 利用它内置的html.parser解析器解析
print(soup) # 打印解析的内容(所有源代码)

常见的一些用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
print(soup.get('href'))  # 找到a标签的href参数的值
print(soup.encode('utf-8')) # 将内容以utf-8格式编码
print(soup.a) # 显示a标签,默认为第一个,也可以显示其他标签(只需要soup.标签名)
print(soup.a['href']) # 显示a标签里面的href属性,默认为第一个
print(soup.a.string) # 显示a标签里面的文字,默认为第一个
print(soup.a.find_next_sibling('a')) # 显示第二个a标签
print(soup.a.find_next_sibling('a').find_next_sibling('a')) # 显示第三个a标签
print(soup.a.find_next_siblings('a')) # 显示当前a标签后面的所有a标签,返回一个列表
print(soup.a.find_next_siblings()) # 显示后面的所有标签
print(soup.a.find_next_sibling('p')) # 显示后面的p标签
print(soup.p.find_previous_sibling()) # 显示p前面的一个a标签,他跟find_next_sibling相反,包括后面带s
print(soup.div.contents) # 将div标签的子节点以列表的方式输出
print(soup.a['href']) # 找到a标签的href参数的值,与get()一样
print(soup.div.a['href']) # 多层
print(soup.find_all('a', attrs={'class': 'v'})) # 找到所有class参数为v的a标签,返回一个列表

还有很多其他的用法 具体可以查看 BeautifulSoup4 传送门

本文标题:python爬虫[笔记记录一]

文章作者:smelond

发布时间:2019年02月11日 - 10:02

最后更新:2019年02月16日 - 19:02

原始链接:http://smelond.com/2019/02/11/python爬虫-笔记记录一/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

分享