文章目录
- # Python爬虫介绍
-
- 01. Python构建虚拟环境
- 02. 爬虫介绍
- 03. HTTP与HTTPS
- # urllib基本使用
-
- 04.Urllib的Get和Post用法
- 05. Urllib其他用法
- 06. Urllib异常错误
- 07. Urllib代理设置
- 08. Cookie的作用
- # Request使用
-
- 09. Requests的Get和Post用法
- 10. Requests的其他用法
- # 正则
-
- 11. 正则
- 13. Xpath表达式
- 练习
-
- 爬斗图:[https://www.pkdoutu.com/article/list/?page=1](https://www.pkdoutu.com/article/list/?page=1)
- 爬取链家:[https://sh.lianjia.com/chengjiao/pg1/](https://sh.lianjia.com/chengjiao/pg1/)
- # bs4使用
-
- 15. bs4
- 16.bs4案例
- 17.jsonpath
- 18. 多线程爬虫
- 20.selenium
-
- 一、Selenium
- 二、文件地址
- 三、安装
- 四、驱动下载
- 五、使用
- 六、设置代理
- 七、添加Cookie
- 八、显示等待
- 九、隐式等待
- 十、执行JS
- 十一、设置无页面
- 切换页面
- 21.Scrapy
-
- 一、什么是Scrapy
- 二、Scrapy架构图
- 三、安装
- 四、检验
- 后记
# Python爬虫介绍
01. Python构建虚拟环境
这里推荐使用国内源Anaconda下载安装使用,请参考以下文章:
- ubuntu16.04安装和使用Anaconda3(详细)
- ubuntu16.04使用anaconda创建python虚拟环境
- ubuntu查看tensorflow使用的python解释器位置,pycharm关联
一、安装环境
sudo pip3 install virtualenv -i https://pypi.douban.com/simple/
二、安装virtualenvwrapper
sudo pip3 install virtualenvwrapper -i https://pypi.douban.com/simple/
三、配置
- sudo vim ~/.bashrc
export WORKON_HOME=/home/ljh/.virtualenvs export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3.5 source /usr/local/bin/virtualenvwrapper.sh
- source ~/.bashrc
创建虚拟环境
mkvirtualenv testlev
五、切换虚拟环境
workon testlev
六、关闭虚拟环境
deactivate testlev
七、删除虚拟环境
rmvirtualenv testlev
02. 爬虫介绍
-
爬虫是什么?
网络爬虫(又称网页蜘蛛,网络机器人), 它是一种程序或脚本,按照一定的规则自动捕获万维网络信息。
-
获取数据的方法有几种
- 用户生成数据 百度指数
- 数据平台购买数据 聚合数据
- 政府公开数据 统计局数据
-
爬虫的作用
- 数据分析
- 购物助手
- 咨询网站
- 搜索引擎
-
需要知识
- Python 基础知识
- HTML 基础知识
- 数据持久化知识
- Scrapy框架知识
-
爬虫的分
-
通用爬虫
- 通用网络爬虫 是 捜索引擎抓取系统(Baidu、Google、Yahoo等)的重要组成部分。主要目的是将互联网上的网页下载到本地,形成一个互联网内容的镜像备份。
-
聚焦爬虫
- 聚焦爬虫,是"面向特定主题需求"的一种网络爬虫程序,它与通用搜索引擎爬虫的区别在于:
-
不同
- 聚焦爬虫在实施网页抓取时会对内容进行处理筛选,尽量保证只抓取与需求相关的网页信息。
-
-
Robots协议
全称是“网络爬虫排除标准”(Robots Exclusion Protocol),网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取,
例如:https://www.jd.com/robots.txt
03. HTTP与HTTPS
-
- 中文名叫
超文本传输协议
: 是用于从网络传送超文本数据到本地浏览器的传送协议
- 中文名叫
-
- 简单讲是HTTP的安全版,在HTTP协议的基础上加入SSL层(
HTTP+SSL
) 。 (Secure Sockets Layer 安全套接层)主要用于Web的安全传输协议,在传输层对网络连接进行加密,保障在Internet上数据传输的安全。
- 简单讲是HTTP的安全版,在HTTP协议的基础上加入SSL层(
-
端口
- 的端口号为, 的端口号为
-
SSL
- HTTPS的安全基础是,因此通过它可以传输的内容都是经过SSL加密的
- 建立一个安全有效的信息传送通道,保证数据传送的安全性
- 确定网站的真实性和有效性
- HTTPS的安全基础是,因此通过它可以传输的内容都是经过SSL加密的
-
请求与响应
-
URL
- 统一资源定位符,是用于完整地描述Internet上网页和其他资源的地址的一种标识方法。
- 组成 https://book.qidian.com/info/1004608738#Catalog
- scheme:协议
- host:服务器的IP地址或者域名
- port:服务器的端口
- path:访问资源的路径
- query-string:参数
- anchor:锚
-
请求方法
-
常用请求头
-
指定客户端能够接收的内容类型。
-
浏览器可以接受的字符编码集。
-
指定浏览器可以支持的web服务器返回内容压缩编码类型。
-
浏览器可接受的语言。
-
可以请求网页实体的一个或者多个子范围字段。
-
授权的授权证书。
-
指定请求和响应遵循的缓存机制。
-
表示是否需要持久连接。(HTTP 1.1默认进行持久连接)
-
请求发送时,会把保存在该请求域名下的所有cookie值一起发送给web服务器。
-
请求的内容长度。
-
请求的与实体对应的MIME信息。
-
请求发送的日期和时间。
-
请求的特定的服务器行为。
-
发出请求的用户的Email。
-
指定请求的服务器的域名和端口号。
-
只有请求内容与实体相匹配才有效。
-
如果请求的部分在指定时间之后被修改则请求成功,未被修改则返回304代码。
-
如果内容未改变返回304代码,参数为服务器先前发送的Etag,与服务器回应的Etag比较判断是否改变。
-
如果实体未改变,服务器发送客户端丢失的部分,否则发送整个实体。
-
只在实体在指定时间之后未被修改才请求成功。
-
限制信息通过代理和网关传送的时间。
-
用来包含实现特定的指令。
-
连接到代理的授权证书。
-
只请求实体的一部分,指定范围。
-
先前网页的地址,当前请求网页紧随其后,即来路。
-
客户端愿意接受的传输编码,并通知服务器接受接受尾加头信息。
-
向服务器指定某种传输协议以便服务器进行转换(如果支持。
-
是否是浏览器。
-
通知中间网关或代理服务器地址,通信协议。
-
关于消息实体的警告信息
-
-
响应头
-
表明服务器是否支持指定范围请求及哪种类型的分段请求。
-
从原始服务器到代理缓存形成的估算时间(以秒计,非负)。
-
对某网络资源的有效的请求行为,不允许则返回405。
-
告诉所有的缓存机制是否可以缓存及哪种类型。
-
服务器支持的返回内容压缩编码类型。。
-
响应体的语言。
-
响应体的长度。
-
请求资源可替代的备用的另一地址。
-
返回资源的MD5校验值。
-
在整个返回体中本部分的字节位置。
-
返回内容的MIME类型。
-
原始服务器消息发出的时间。
-
响应过期的日期和时间。
-
请求资源的最后修改时间。
-
用来重定向接收方到非请求URL的位置来完成请求或标识新的资源。
-
包括实现特定的指令,它可应用到响应链上的任何接收方。
-
它指出认证方案和可应用到代理的该URL上的参数。
-
应用于重定向或一个新的资源被创造,在5秒之后重定向(由网景提出,被大部分浏览器支持)
-
如果实体暂时不可取,通知客户端在指定时间之后再次尝试。
-
服务器软件名称。
-
设置Http Cookie。
-
指出头域在分块传输编码的尾部存在。
-
文件传输编码。
-
告诉下游代理是使用缓存响应还是从原始服务器请求。
-
告知代理客户端响应是通过哪里发送的。
-
警告实体可能存在的问题。
-
表明客户端请求实体应该使用的授权方案。
-
-
状态码
- 200 - 请求成功
- 301 - 资源(网页等)被永久转移到其它URL
- 302 - 资源(网页等)被临时转移到其它URL
- 401 - 未授权
- 403 - 禁止访问
- 408 - 请求超时
- 404 - 请求的资源(网页等)不存在
- 500 - 内部服务器错误
- 503 - 服务器不可用
# urllib基本使用
04.Urllib的Get和Post用法
-
Decode
- Decode的作用是将其他编码的字符串转换成unicode编码,如str.decode(‘gb2312’),表示将gb2312编码的字符串str1转换成unicode编码。
-
Encode
- Encode的作用是将unicode编码转换成其他编码的字符串,如str.encode(‘gb2312’),表示将unicode编码的字符串str2转换成gb2312编码。
-
Get请求
- URL编码
word = { "wd" : "美女"} # 通过urllib.urlencode()方法,将字典键值对按URL编码转换,从而能被web服务器接受。 result = urllib.parse.urlencode(word) print(result)
- 解码
result = urllib.parse.unquote(result) print(result)
- 发送请求
response = urllib.request.urlopen(request) print(response.read())
-
POST请求
-
# POST请求的目标URL(这个代码是之前的链接,方便我们使用,不用传递sign参数,新版中该参数是加密的) url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=null" #构建表单数据 formdata = { 'i': '你好', 'from': 'AUTO', 'to': 'AUTO', 'smartresult': 'dict', 'client': 'fanyideskweb', 'doctype': 'json', 'version': '2.1', 'keyfrom': 'fanyi.web', 'action': 'FY_BY_CLICKBUTTION', 'typoResult': 'false', } formdata = urllib.parse.urlencode(formdata) formdata = formdata.encode('utf-8') req = request.Request(url, data = formdata, headers = headers) #发起请求获取响应结果 response = request.urlopen(req) #打印获取的响应结果 print (response.read().decode('utf-8'))
-
-
忽略SSL验证
from urllib import request # 1. 导入Python SSL处理模块 import ssl # 2. 表示忽略未经核实的SSL证书认证 context = ssl._create_unverified_context() # 目标url url = "https://www.12306.cn/mormhweb/" #设置请求头 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"} #构建request对象 request = urllib.request.Request(url, headers = headers) # 3. 在urlopen()方法里 指明添加 context 参数 response = urllib.request.urlopen(request, context = context) html = response.read().decode() print (html)
05. Urllib其他用法
-
url = 'https://book.qidian.com/info/1004608738?wd=123&page=20#Catalog' """ url:待解析的url scheme='':假如解析的url没有协议,可以设置默认的协议,如果url有协议,设置此参数无效 allow_fragments=True:是否忽略锚点,默认为True表示不忽略,为False表示忽略 """ result = parse.urlparse(url=url,scheme='http',allow_fragments=True) print(result) print(result.scheme)
-
url_parmas = ('https', 'book.qidian.com', '/info/1004608738', '', 'wd=123&page=20', 'Catalog') #components:是一个可迭代对象,长度必须为6 result = parse.urlunparse(url_parmas) print(result) """ https://book.qidian.com/info/1004608738?wd=123&page=20#Catalog """
-
base_url = 'https://book.qidian.com/info/1004608738?wd=123&page=20#Catalog' sub_url = '/info/100861102' full_url = parse.urljoin(base_url,sub_url) print(full_url)
-
parmas_str = 'page=20&wd=123' parmas = parse.parse_qs(parmas_str) print(parmas) """ {'page': ['20'], 'wd': ['123']} """
-
word = '中国梦' url = 'http://www.baidu.com/s?wd='+parse.quote(word) print(parse.quote(word)) print(url) """ %E4%B8%AD%E5%9B%BD%E6%A2%A6 http://www.baidu.com/s?wd=%E4%B8%AD%E5%9B%BD%E6%A2%A6 """
-
url = 'http://www.baidu.com/s?wd=%E4%B8%AD%E5%9B%BD%E6%A2%A6' print(parse.unquote(url)) """ http://www.baidu.com/s?wd=中国梦 """
06. Urllib异常错误
-
- 来自urllib库的error模块,继承自OSError,由request模块产生的异常都可以通过捕捉这个类来处理.
- 没有网络连接
- 服务器连接失败
- 找不到指定的服务器
- 来自urllib库的error模块,继承自OSError,由request模块产生的异常都可以通过捕捉这个类来处理.
-
HTTPError
-
HTTPError是URLError的子类,我们发出一个请求时,服务器上都会对应一个response应答对象,其中它包含一个数字"响应状态码"。
-
专门用来处理HTTP请求错误,比如未认证,页面不存在等
-
有三个属性:
-
code:返回HTTP的状态码
-
reason:返回错误原因
-
headers:返回请求头
from urllib import request,error def check_error(): """ 因为HTTPError的父类是URLError,所以我们更好的处理顺序应该是 先捕获子类的错误,再捕获父类的错误 """ req_url = 'https://www.baiduxxx.com/' try: response = request.urlopen(url=req_url) print(response.status) except error.HTTPError as err: print(err.code,err.reason,err.headers) except error.URLError as err: print('===', err.reason)
-
-
07. Urllib代理设置
- 自定义Opener
我们之前一直都在使用的urlopen,它是一个特殊的opener,是模块帮我们创建好的。自定义Opener会有更高级的用法
import urllib.request
# 构建一个HTTPHandler 处理器对象,支持处理HTTP请求
http_handler = urllib.request.HTTPHandler()
# 构建一个HTTPHandler 处理器对象,支持处理HTTPS请求
# http_handler = urllib.request.HTTPSHandler()
# 调用urllib.request.build_opener()方法,创建支持处理HTTP请求的opener对象
opener = urllib.request.build_opener(http_handler)
# 构建 Request请求
request = urllib.request.Request("http://www.baidu.com/")
# 调用自定义opener对象的open()方法,发送request请求
response = opener.open(request)
# 获取服务器响应内容
print (response.read().decode())
-
代理设置
-
-
1.,访问一些平时不能访问的站点。
-
2.:比如使用教育网内地址段免费代理服务器,就可以用于对教育网开放的各类FTP下载上传,以及各类资料查询共享等服务。
-
3.:通常代理服务器都设置一个较大的硬盘缓冲区,当有外界的信息通过时,同时也将其保存到缓冲区中,当其他用户再访问相同的信息时,则直接由缓冲区中取出信息,传给用户,以提高访问速度。
-
4.:上网者也可以通过这种方法隐藏自己的IP,免受攻击。对于爬虫来说,我们用代理就是为了隐藏自身IP,防止自身的IP被封锁。
-
-
-
FTP代理服务器**:主要用于访问FTP服务器,一般有上传、下载的功能以及缓存的功能,端口号一般为21,2121等。**
-
HTTP代理服务器**:主要用于访问网页,一般有内容过滤和缓存的功能,端口号一般为80、8080、3128等**
-
:主要能用于访问加密的网站,一般有SSL或者TLS加密**
-
:只是单纯的用于传输数据包,不关心具体的协议用法,速度快、有缓存功能,端口号一般为1080
-
-
-
:会将数据包原封不动的转发,在服务器看来就好像真的是一个普通的用户短在访问,而记录的IP就是代理服务器的IP
-
:会在数据包上做一些改动,服务端上有可能发现这个是代理服务器,也有一定的几率追查到客户端的真实IP.
-
:不但改动了数据包,还会告诉服务器客户端的真实IP,这种代理除了用缓存技术提高浏览器速度。能用内容过滤提高安全性之外,并没有其他作用。
-
这是爬虫/反爬虫的第二大招,通常也是最好用的。
-
-
- 西刺免费代理IP
- 快代理免费代理
from urllib import request,error
#构建支持代理的handler
proxy = {
'http':'61.138.33.20:808',
'https':'120.69.82.110:44693',
}
proxy_handler = request.ProxyHandler(
proxies=proxy
)
# 构建一个私密代理Handler,需要加上私密代理账户的用户名和密码
# authproxy = {
# "http" :"username:password@61.135.217.7:80"
#}
# authproxy_handler=urllib.request.ProxyHandler(
# proxies=authproxy
#)
#根据proxy_handler实例化一个opener对象
opener = request.build_opener(proxy_handler)
url = 'http://www.baidu.com/'
# 使用https://httpbin.org/get接口验证使用了代理
# url = 'https://httpbin.org/get'
try:
response = opener.open(url,timeout=5)
print(response.status)
except error.HTTPError as err:
print(err.reason)
except error.URLError as err:
print(err.reason)
# 1. 如果按照上面代码,只有使用opener.open()方法发送
请求才使用自定义的代理,而urlopen()则不使用自定义代理。
response = opener.open(request)
# 2. 将自定义的opener设置为全局的opener,之后所有的,不管是
opener.open()还是urlopen() 发送请求,都将使用自定义代理。
# request.install_opener(opener)
# response = urlopen(request)
08. Cookie的作用
-
Cookies的作用
- Cookies是最直接的应用就是检测用户是否已经登录
获取到一个有登录信息的Cookie模拟登陆 # -*- coding:utf-8 -*- import urllib.request url = 'https://www.douban.com/people/175417123/' #根据刚才的登录信息来构建一个已经登录过的用户的headers信息 headers = { 'User-Agent':' Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:59.0) Gecko/20100101 Firefox/59.0', 'Host':'www.renren.com', 'Cookie':'anonymid=jgoj4xlw-3izsk4; depovince=BJ; jebecookies=62d94404-de1f-450a-919b-a2d9f4c8b811|||||; _r01_=1; JSESSIONID=abchsGLNgne0L8_wz2Emw; ick_login=cf54f2dc-8b0b-417a-96b2-32d4051f7236; jebe_key=02cb19ad-2966-4641-8828-217160ca67a0%7Cba6f6d6ec917200a4e17a85dbfe33a4a%7C1525230975024%7C1%7C1525230982574; t=87a502d75601f8e8c0c6e0f79c7c07c14; societyguester=87a502d75601f8e8c0c6e0f79c7c07c14; id=965706174; xnsid=e1264d85; ver=7.0; loginfrom=null; wp_fold=0', } # 2. 通过headers里的报头信息(主要是Cookie信息),构建Request对象 request = urllib.request.Request(url, headers=headers) # 3. 直接豆瓣个人主页(主要是Cookie信息) #,判断这是一个已经登录的用户,并返回相应的页面 response = urllib.request.urlopen(request) # 4. 打印响应内容 print (response.read().decode())
-
CookieJar
- 用来储存Cookie值,存在内存中,向传出的HTTP请求添加cookie的对象。
import http.cookiejar as cookiejar from urllib import parse,request #1.构造一个CookieJar对象实例来保存cookie cookie = cookiejar.CookieJar() # 2.使用HTTPCookieProcessor()创建cookie处理器对象, # 参数为CookieJar()对象 cookie_handler = request.HTTPCookieProcessor(cookie) #3.通过build_opener()来构建opener opener = request.build_opener(cookie_handler) #4.addheaders接受一个列表,里面每一个元素都是一个headers信息的元组 #opener将会附带header信息 opener.addheaders = [ ('User-Agent','Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:59.0) Gecko/20100101 Firefox/59.0'), ] #5.需要登录账号和密码 data = { 'source': 'index_nav', 'form_email': '18518753265', 'form_password': 'ljh123456', } #6. 通过urlencode()转码 postdata = parse.urlencode(data).encode('utf-8') #7. 构建Request请求对象,包含需要发送的用户名和密码 request = request.Request("https://www.douban.com/accounts/login", data = postdata) # 8. 通过opener发送这个请求,并获取登录后的Cookie值, opener.open(request) # 9. opener包含用户登录后的Cookie值,可以直接访问那些登录后才可以访问的页面 response = opener.open("https://www.douban.com/people/175417123/") #这里为了测试不添加cookie时访问改界面的效果 #headers = { # 'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:59.0) Gecko/20100101 #Firefox/59.0', #} # request = request.Request('https://www.douban.com/people/175417123/',headers=headers) # response = request.urlopen(request) # 10. 打印响应内容 #打印结果查看是否访问成功 print(response.code) html = response.read().decode('utf-8') # print(html) with open('douban_login.html','w') as f: f.write(html)
# Request使用
09. Requests的Get和Post用法
-
requests
- requests是python实现的简单易用的HTTP库,使用起来比urllib简洁很多。
-
Get请求
response = requests.get("http://www.baidu.com/") * response的常用方法: * response.text 返回解码后的字符串 * respones.content 以字节形式(二进制)返回。 * response.status_code 响应状态码 * response.request.headers 请求的请求头 * response.headers 响应头 * response.encoding = 'utf-8' 可以设置编码类型 * response.encoding 获取当前的编码 * response.json() 内置的JSON解码器,以json形式返回,前提返回的内容确保是json格式的,不然解析出错会抛异常
-
添加请求头
import requests kw = { 'wd':'美女'} headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36" } # params 接收一个字典或者字符串的查询参数, # 字典类型自动转换为url编码,不需要urlencode() response = requests.get( "http://www.baidu.com/s?", params = kw, headers = headers )
-
- 使用response.text 时,Requests 会基于 HTTP 响应的文本编码自动解码响应内容,大多数 Unicode 字符集都能被无缝地解码,但是也会出现乱码请求。推荐使用response.content.deocde()
- 使用response.content 时,返回的是服务器响应数据的原始二进制字节流,可以用来保存图片等二进制文件。
-
Post请求
import requests req_url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=null" #分析表单数据 formdata = { 'i': '老鼠爱大米', 'from': 'AUTO', 'to': 'AUTO', 'smartresult': 'dict', 'client': 'fanyideskweb', 'doctype': 'json', 'version': '2.1', 'keyfrom': 'fanyi.web', 'action': 'FY_BY_CLICKBUTTION', 'typoResult': 'false', } #添加请求头 req_header = { 'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36', } response = requests.post( req_url, data = formdata, headers = req_header ) #print (response.text) # 如果是json文件可以直接显示 print (response.json())
10. Requests的其他用法
-
上传文件
url = 'https://httpbin.org/post' files = { 'file': open('image.png', 'rb')} response = requests.post(url, files=files) print(response.text)
-
Web客户端验证
import requests auth=('test', '123456') response = requests.get( 'http://192.168.199.107', auth = auth ) print (response.text)
-
代理设置
import requests # 根据协议类型,选择不同的代理 proxies = { "http": "http://11.44.156.126:4532", "https": "http://11.134.156.126:4532", } 标签:
sp2841a502角度传感器a502高精度电位计角度传感器