python爬虫简单学习,只能入个门
python爬虫简单学习
句子含义
导入模块
1
import requests
获取网页
1
2r = requests.get('https://api.github.com/events')
Github 的公共时间线
总体功能的一个演示
1 | import requests |
很多情况下的网站如果直接response.text会出现乱码的问题,所以这个使用response.content
这样返回的数据格式其实是二进制格式,然后通过decode()转换为utf-8,这样就解决了通过response.text直接返回显示乱码的问题.
请求
基本GET请求
1 | import requests |
带参数的GET
1 | import requests |
使用params关键字传递参数
1 |
|
解析json
1 | import requests |
requests里面集成的json其实就是执行了json.loads()方法,两者的结果是一样的
获取二进制数据
使用的response.content,这样获取的数据是二进制数据,同样的这个方法也可以用于下载图片以及
视频资源
1 | import requests |
添加headers
以知乎为例,以下脚本访问会出错
1 | import requests |
因为访问知乎需要头部信息,这个时候我们在谷歌浏览器里输入chrome://version,就可以看到用户代理,将用户代理添加到头部信息
1 | import requests |
post
1 | import requests |
只修改了get和post 的区别
响应
可以通过response获得很多属性,例子如下
1 | import requests |
requests高级用法
文件上传
实现方法和其他参数类似,也是构造一个字典然后通过files参数传递
1 | import requests |
获取cookie
1 | import requests |
会话维持
cookie的一个作用就是可以用于模拟登陆,做会话维持
1 | import requests |
证书验证
现在的很多网站都是https的方式访问,所以这个时候就涉及到证书的问题
1 | import requests |
代理设置
1 | import requests |
如果代理需要设置账户名和密码,只需要将字典更改为如下:proxies = {
"http":"[http://user:password@127.0.0.1:9999](http://user:password@127.0.0.1:9999/)"
}
如果你的代理是通过sokces这种方式则需要pip install “requests[socks]”proxies= {
"http":"socks5://127.0.0.1:9999",
"https":"sockes5://127.0.0.1:8888"
}
超时设置
通过timeout参数可以设置超时的时间
认证设置
如果碰到需要认证的网站可以通过requests.auth模块实现
1 | import requests |
或者
1 | import requests |
异常处理
关于reqeusts的异常在这里可以看到详细内容:
http://www.python-requests.org/en/master/api/#exceptions
所有的异常都是在requests.excepitons中
简单演示
1 | import requests |
Beautiful Soup的用法
解析器
解析器 | 使用方法 | 优势 | 劣势 |
---|---|---|---|
Python标准库 | BeautifulSoup(markup, “html.parser”) | Python的内置标准库、执行速度适中、文档容错能力强 | Python 2.7.3及Python 3.2.2之前的版本文档容错能力差 |
xml HTML解析器 | BeautifulSoup(markup, “lxml”) | 速度快、文档容错能力强 | 需要安装C语言库 |
lxml XML解析器 | BeautifulSoup(markup, “xml”) | 速度快、唯一支持XML的解析器 | 需要安装C语言库 |
html5lib | BeautifulSoup(markup, “html5lib”) | 最好的容错性、以浏览器的方式解析文档、生成HTML5格式的文档 | 速度慢、不依赖外部扩展 |
lxml解析器有解析HTML和XML的功能,而且速度快,容错能力强,所以推荐使用它。
初始化Beautiful Soup
1 | from bs4 import BeautifulSoup |
基本用法
1 | html = """ |
详细选择元素
1 |
输出
1 | <title>The Dormouse's story</title> |
获取名称
1
print(soup.title.name)
1
title
获取属性
每个节点可能有多个属性,比如id和class等,选择这个节点元素后,可以调用attrs获取所有属性:
1
2print(soup.p.attrs)
print(soup.p.attrs['name'])1
2{'class': ['title'], 'name': 'dromouse'}
dromouse简写:
1
2print(soup.p['name'])
print(soup.p['class'])关联选择
返回p的直接子节点
1
2
3
4
5from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.p.children)
for i, child in enumerate(soup.p.children):
print(i, child)返回p的所有子孙节点
1
2
3
4
5from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.p.descendants)
for i, child in enumerate(soup.p.descendants):
print(i, child)父节点
1
2
3from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.a.parent)所有祖先节点
1
2
3soup = BeautifulSoup(html, 'lxml')
#print(type(soup.a.parents))
print(list(enumerate(soup.a.parents)))兄弟节点
1
2
3
4
5
6from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print('Next Sibling', soup.a.next_sibling)
print('Prev Sibling', soup.a.previous_sibling)
print('Next Siblings', list(enumerate(soup.a.next_siblings)))
print('Prev Siblings', list(enumerate(soup.a.previous_siblings)))*其中next_sibling和previous_sibling分别获取节点的下一个和上一个兄弟元素,next_siblings和previous_siblings则分别返回所有前面和后面的兄弟节点的生成器。 *
提取信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21html = """
<html>
<body>
<p>
<p class="story">
Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Bob</a><a href="http://example.com/lacie" class="sister" id="link2">Lacie</a>
</p>
<p>
"""
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print('Next Sibling:')
print(type(soup.a.next_sibling))
print(soup.a.next_sibling)
print(soup.a.next_sibling.string)
print('Parent:')
print(type(soup.a.parents))
print(list(soup.a.parents)[0])
print(list(soup.a.parents)[0].attrs['class'])结果
1
2
3
4
5
6
7
8
9
10
11Next Sibling:
<class 'bs4.element.Tag'>
<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>
Lacie
Parent:
<class 'generator'>
<p class="story">
Once upon a time there were three little sisters; and their names were
<a class="sister" href="http://example.com/elsie" id="link1">Bob</a><a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>
</p>
['story']方法选择器
find_all()
1
find_all(name , attrs , recursive , text , **kwargs)
1
2
3
4from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.find_all(name='ul'))
print(type(soup.find_all(name='ul')[0]))嵌套查询
1
2
3
4for ul in soup.find_all(name='ul'):
print(ul.find_all(name='li'))
for li in ul.find_all(name='li'):
print(li.string)attrs
1
2
3
4from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.find_all(attrs={'id': 'list-1'}))
print(soup.find_all(attrs={'name': 'elements'}))text
text参数可用来匹配节点的文本,传入的形式可以是字符串,可以是正则表达式对象
1
2
3from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.find_all(text=re.compile('link')))1
2
3
4
5find_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选择器
1
2
3
4
5
6from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.select('.panel .panel-heading'))
print(soup.select('ul li'))
print(soup.select('#list-2 .element'))
print(type(soup.select('ul')[0]))
selenium
声明浏览器对象
1 | from selenium import webdriver |
访问页面
1 | from selenium import webdriver |
查找单个元素
1 | from selenium import webdriver |
比较通用的一种
1 | from selenium import webdriver |
查找多个元素
1 | from selenium import webdriver |