爬虫的基本原理
什么是爬虫
- 请求网站并提取数据的自动化程序
- URL:统一资源定位符
能抓怎样的数据
- 网页文本
- 图片,音频,视频
- 705写入成功
怎么解析
- 1.直接处理
- 2.json解析
- 3.正则表达式
- 4.bs4
- 5.pyQuery
- 6.xpath
怎么解决javascript渲染的问题的?
- 1.分析ajax请求
- 2.使用selenium/webDriver
- 3.splash
- 4.pyv8或Ghost.py
怎么保存数据
- 文本型
- 关系型数据库
- 非关系型数据库
- 二进制文件
urllib库详解
什么是urllib(python内置的http库)
- Urllib.request() 请求模块
- urllib.error 异常处理模块
- urllib.parse url解析模块
- urllib.robotparser robots.txt 解析模块
基本用法
GET请求(例子)
1 | import urllib.request |
POST请求(例子)
1 | import urllib.parse |
获取数据并自动保存
1 | from urllib import request |
设置超时时间
正常
1 | import urllib.request |
报错
1 | import socket |
请求
1 | import urllib.request |
响应
1 | # 响应类型:<class 'http.client.HTTPResponse'> |
代理
1 | from urllib import request |
异常处理
1 | from urllib import request,error |
1 | from urllib import request,error |
url解析
协议类型:scheme=’http/https’
allow_fragments:#号后的内容存放在哪里
urlunparse:将内容上面返回的内容进行拼接的
urljoin:对两个url进行拼接,以后面的url为标准,有就覆盖,没有就用前面的
import urllib.robotparser :查看那些路径是可以访问的,那些事不可以访问的
re模块的基本使用
常见的使用方法
- re.S:匹配换行符
- re.match(正则,带匹配的字符串):尝试从起始位置匹配一个模式,没有返回None
- group:匹配结果
- span:匹配的位置
- group:匹配结果
- re.search :匹配所有能匹配到的,并返回第一个
- re.sub(正则,要替换的字符串,’字符串’) :
- re.findall(正则,字符串)
- re.compile():将正则字符串,编译成一个正则对象
bs4的基本使用方法
lxml的使用方法
1 | from lxml import etree |
BeautifulSoup的使用方法
1 | from bs4 import BeautifulSoup |
标签选择器
获取名称
1 | print(soup.title.name) |
获取属性
1 | print(soup.p.attrs['name']) |
获取内容
1 | print(soup.p.string) |
嵌套选择
1 | print(soup.head.title.string) |
子节点和子孙节点
1 | print(soup.body.contents) # 返回一个列表 |
父节点和祖先节点
1 | print(soup.a.parent) # 父节点,只有一个 |
兄弟节点
1 | print(list(soup.p.next_siblings)) |
标准选择器
根据标签
1 | print(soup.find_all('ul')) |
根据属性
1 | print(soup.find_all(attrs={'id':'list_1'})) |
根据文本
1 | print(soup.find_all(text=[777,666,888])) |
返回单个元素
1 | print(soup.find_parent('title')) :返回父节点 |
css选择器
1 | print(soup.select('.p1 .a1')) |
获取属性
1 | ul["id"] |
获取内容
1 | for i in soup.select('#list_1 .a1'): |
pyquery库的使用
基本使用
1 | from pyquery import PyQuery as py |
查找元素
子元素
所有的
1 | doc = py(html) |
直接的
1 | doc = py(html) |
子元素筛选
1 | item = doc('#list_1') |
父元素
1 | item = doc('#list_1') |
兄弟元素
1 | item = doc('#list_1') |
遍历
单个元素
1 | item = doc('#list_1') |
返回迭代器
1 | item = doc('#list_1').items() |
获取信息
获取属性
1 | item = doc('#list_1 a') |
获取文本
1 | item = doc('#list_1 a') print(item.text()) |
获取html
1 | item = doc('#list_1') print(item.html()) |
DOM操作
addClass和removeClass
1 | item = doc('#list_1') |
attr 和 css
1 | item = doc('#list_1') |
remove:把中间a标签全部删除
1 | item = doc('#list_1') |
伪类选择器
1 | doc = py(html) |
requests库的基本使用
实例
1 | import requests |
所有请求方式
- requests.get()
- requests.post()
- requests.put()
- requests.patch()
- requests.options()
- requests.head()
- requests.delete()
获取数据
- res.json() :获取json数据
- res.text:获取文本信息
- res.content :获取二进制数据
响应
- status_code :获取状态码
- text:获取文本信息
- headers:获取头部信息
- content:获取二进制数据
- cookies:获取cookie
- url:访问的url
- history:历史记录
高级操作
文件上传
1 | import requests |
获取cookie
1 | res.cookies.item() |
会话维持
1 | import requests |
代理设置
1 | import requests |
超时设置
1 | from requests.exceptions import ReadTimeout |
认证设置
1 | res = requests.get('http://www.baidu.com',auth={'user':123}) |
异常处理
1 | from requests.exceptions import ReadTimeout, HTTPError,RequestException |
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 |
多个元素
第一种
1 | from selenium import webdriver |
第二种
1 | from selenium import webdriver |
元素交互操作
1 | import time |
交互动作
1 | from selenium import webdriver |
执行js
1 | from selenium import webdriver |
获取元素信息
获取属性
1 | from selenium import webdriver |
获取文本值
1 | from selenium import webdriver |
获取id,位置,标签名,大小
1 | from selenium import webdriver |
Frame:进去和出来
1 | import time |
等待
隐式等待
1 | from selenium import webdriver |
显示等待
1 | from selenium import webdriver |
前进和后退
1 | from selenium import webdriver |
设置cookie
1 | from selenium import webdriver |
选项卡设置
1 | import time |
异常处理
1 | from selenium import webdriver |