爬虫简介
-
前提知识:html、css、js、Ajax、re、Xpath、XML、url、HTTP协议
-
爬虫定义:网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),
是一种按照一定的规则,自动抓取万维网信息的程序或者脚本。 -
两大特征:
- 能按作者要求下载数据或内容
- 能自动在网络上流传
-
三大步骤:
- 下载信息
- 提取正确的信息
- 根据一定规则自动跳到另外的网页上执行上两步内容
-
爬虫分类
- 通用爬虫
- 专用爬虫(聚焦爬虫)
-
python网络包简介:
- python2.x:urllib,urllib2,urllib3,httplib,httplib2,requests
- python3.x:urllib,urllib3,httplib2,requests
- python2: urllib和urllib2配合使用,或者requests
- python3:urllib,requests
urllib
- 包含模块:
- urllib.request:打开和读取urls
- urllib.error:包含urllib.request产生的常见的错误,使用try捕捉
- urllib.parse:包含解析url的方法
- urllib.robotparse:解析robots.txt文件
- 案例1
#案例1
'''
使用urllib.request请求一个网页内容,并把内容打印出来
'''
from urllib import request
if __name__ == "__main__":
url = "https://job.youkuaiyun.com/c/513576"
# 打开相应url并把相应页面作为返回
rsp = request.urlopen(url)
# 把返回结果读取出来
# 读取出来内容类型为bytes
html = rsp.read()
print(type(html))
# 如果想把bytes内容转换成字符串,需要解码
html = html.decode("utf-8")
print(html)
网页编码问题解决
- chardet 可以自动检测页面文件的编码格式,但是,可能有误
- 需要安装:conda install chardet 或 pip install chardet
- 案例2
# 案例2
'''
利用request下载页面
自动检测页面编码
'''
import urllib
import chardet
if __name__ == "__main__":
url= "https://www.21wecan.com/rsdl/"
rsp = urllib.request.urlopen(url)
html = rsp.read()
# 利用 chardet自动检测
cs = chardet.detect(html)
print(type(cs))
print(cs)
html = html.decode(cs.get("encoding","utf-8"))
print(html)
urlopen的返回对象
- geturl: 返回请求对象的url
- info:请求反馈对象的meta信息
- getcode:返回的http code 200
- 案例3
# 案例3
'''
使用urllib.request请求一个网页内容,并把内容打印出来
'''
from urllib import request
if __name__ == "__main__":
url = "https://job.youkuaiyun.com/c/513576"
# 打开相应url并把相应页面作为返回
rsp = request.urlopen(url)
print(type(rsp))
print(rsp)
print("URL:{0}".format(rsp.geturl()))
print("Info:{0}".format(rsp.info()))
print("Code:{0}".format(rsp.getcode()))
# 把返回结果读取出来
# 读取出来内容类型为bytes
html = rsp.read()
print(type(html))
# 如果想把bytes内容转换成字符串,需要解码
html = html.decode("utf-8")
print(html)
request.data的使用
- 访问网络的两种方法
-
get
- 利用参数给服务器传递信息
- 参数为dict,然后用parse编码
-
案例4,爬取不能用https,用http才行
-
post
- 一般向服务器传递参数使用
- post是把信息自动加密处理
- 我们如果用post信息,需要用到data参数
- 使用post,意味着HTTP的请求头可能需要更改:
- Content-Type: application/x-www.form-urlencode
- Content-Length: 数据长度
- 简而言之,一旦更改请求方法,请注意其他请求头部信息相适应
- urllib.parse.urlencode可以将字符串自动转换成上面的
-
案例5
-
为了更多的设置请求信息,单纯的通过urlopen函数已经不太好用了
-
需要用到request.Request类
-
案例6
-
# 案例4
from urllib import request,parse
'''
掌握对url进行参数编码的方法
需要使用parse模块
'''
if __name__ == "__main__":
url = "http://www.baidu.com/s?"
wd = input("Input your keyword:")
#要想使用data,需要使用字典结构
qs = {
"wd": wd
}
#转换url编码
qs = parse.urlencode(qs)
print(qs)
fullurl = url + qs
print(fullurl)
# 打开相应url并把相应页面作为返回
rsp = request.urlopen(fullurl)
# 把返回结果读取出来
# 读取出来内容类型为bytes
html = rsp.read()
print(type(html))
# 如果想把bytes内容转换成字符串,需要解码
html = html.decode("utf-8")
print(html)
# 案例5
'''
利用parse模块模拟post请求
分析百度词典
分析步骤:
1. 打开F12
2. 尝试输入单词girl,发现每敲一个字母后都有请求
3. 请求地址是 http://fanyi.baidu.com/sug
4. 利用NetWork-All-Heards查看,发现FormDate的值是 kw:girl
5. 检查返回内容格式,发现返回的是json格式==》需要用到json包
'''
from urllib import request,parse
# 负责处理json格式的模块
import json
'''
大致流程是:
1. 利用data构造内容,然后urlopen打开
2. 返回一个json格式的结果
3. 结果就应该是girl的释义
'''
baseurl = "http://fanyi.baidu.com/sug"
wd = input("Input your keyword")
# 存放用来模拟form的数据一定是dict格式
data = {
#girl 是翻译输入的英文内容,应该是由用户输入,此处使用硬编码
'kw':wd
}
# 需要使用parse模块对data进行编码
data = parse.urlencode(data).encode('utf-8')
# 有了data,url,就可以发出请求了
rsp = request.urlopen(baseurl,data=data)
json_data = rsp.read().decode('utf-8')
print(json_data)
#把json字符串转化成字典
json_data = json.loads(json_data)
print(type(json_data))
print(json_data)
for item in json_data['data']:
print(item['k']--item['v'])
# 案例6,本案例只是利用Request类来实现案例五的内容
'''
利用parse模块模拟post请求
分析百度词典
分析步骤:
1. 打开F12
2. 尝试输入单词girl,发现每敲一个字母后都有请求
3. 请求地址是 http://fanyi.baidu.com/sug
4. 利用NetWork-All-Heards查看,发现FormDate的值是 kw:girl
5. 检查返回内容格式,发现返回的是json格式==》需要用到json包
'''
from urllib import request,parse
# 负责处理json格式的模块
import json
'''
大致流程是:
1. 利用data构造内容,然后urlopen打开
2. 返回一个json格式的结果
3. 结果就应该是girl的释义
'''
baseurl = "http://fanyi.baidu.com/sug"
wd = input("Input your keyword")
# 存放用来模拟form的数据一定是dict格式
data = {
#girl 是翻译输入的英文内容,应该是由用户输入,此处使用硬编码
'kw':wd
}
# 需要使用parse模块对data进行编码
data = parse.urlencode(data).encode('utf-8')
headers = {
#因为使用post模块对data进行编码,至少包含content-length字段
'Content-Length':len(data)
}
#构造一个Request的实例
req = request.Request(url=baseurl,data=data,headers=headers)
# 因为已经构造了一个Request的请求,则所有的请求信息可以封装在Request实例中
rsp = request.urlopen(req)
json_data = rsp.read().decode('utf-8')
print(json_data)
#把json字符串转化成字典
json_data = json.loads(json_data)
print(type(json_data))
print(json_data)
# for item in json_data['data']:
# print(item['k']--item['v'])
urllib.error(OSErroe的子类)
- URLError产生的原因:
- 没网
- 服务器连接失败
- 找不到指定服务器
- 案例1
- HTTPError,是URLError的一个子类
- 案例2
- 两者区别:
- HTTPError是对应的HTTP请求的返回码错误,如果返回错误码是400以上的,则引发HTTPError
- URLError对应的一般是网络出现问题,包括url问题
- 包含关系区别:OSError->URLError->HTTPError
from urllib import request,error
if __name__ == "__main__":
url = "http://www.baidu.com"
try:
req = request.Request(url)
rsp = request.urlopen(req)
html = rsp.read().decode()
print(html)
except error.URLError as e:
print("URLError: {0}".format(e.reason))
print("URLError: {0}".format(e))
except Exception as e:
print(e)
from urllib import request,error
if __name__ == "__main__":
url = "http://www.sipo.gov.cn/www"
try:
req = request.Request(url)
rsp = request.urlopen(req)
html = rsp.read().decode()
print(html)
except error.HTTPError as e:
print("HTTPError:{0}".format(e.reason))
print("HTTPError:{0}".format(e))
except error.URLError as e:
print("URLError: {0}".format(e.reason))
print("URLError: {0}".format(e))
except Exception as e:
print(e)
UserAgent
-
UserAgent: 用户代理,简称UA。属于heads的一部分,服务器通过UA来判断访问者身份
-
常见的UA值,使用的时候可以直接复制粘贴,也可以用浏览器访问的时候抓包
-
Opera
Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 OPR/26.0.1656.60
Opera/8.0 (Windows NT 5.1; U; en)
Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.50
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 9.50 -
Firefox
Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0
Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10 -
Safari
Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2 -
chrome
Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11
Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16 -
360
Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36
Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko -
淘宝浏览器
Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.11 TaoBrowser/2.0 Safari/536.11
-
-
设置UA可以通过两种方式:
- heads
- add_header
'''
访问一个网址
更改自己的UserAgent进行伪装
'''
from urllib import request,error
if __name__ == "__main__":
url = "http://www.baidu.com"
try:
#使用head方法伪装UA
headers = {}
headers["User-Agent"] = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.11 TaoBrowser/2.0 Safari/536.11"
req = request.Request(url,headers=headers)
#正常访问
rsp = request.urlopen(req)
html = rsp.read().decode()
print(html)
except error.HTTPError as e:
print(e)
except error.URLError as e:
print(e)
except Exception as e:
print(e)
'''
访问一个网址
更改自己的UserAgent进行伪装
'''
from urllib import request,error
if __name__ == "__main__":
url = "http://www.baidu.com"
try:
# 使用添加的方式进行访问
req = request.Request(url)
req.add_header("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko")
#正常访问
rsp = request.urlopen(req)
html = rsp.read().decode()
print(html)
except error.HTTPError as e:
print(e)
except error.URLError as e:
print(e)
except Exception as e:
print(e)
ProxyHandler处理(代理服务器)
- 使用代理IP,是爬虫的常用手段
- 获取代理服务器的地址:
- www.xicidaili.com
- www.goubanjia.com
- 代理用来隐藏真实访问中,代理也不允许频繁访问某一个固定网站,所以,代理一定要很多很多
- 基本使用步骤:
-
- 设置代理地址
-
- 创建ProxyHandler
-
- 创建Opener
-
- 安装Opener
-
from urllib import request,error
if __name__ == "__main__":
url = "http://www.baidu.com"
#1.设置代理地址
proxy = {'http':'101.4.136.34:81'}
#2. 创建ProxyHandler
proxy_handler = request.ProxyHandler(proxy)
#3. 创建Opener
opener = request.build_opener(proxy_handler)
#4. 安装Opener
request.install_opener(opener)
#现在如果访问url,则使用代理服务器
try:
rsp = request.urlopen(url)
html = rsp.read().decode()
print(html)
except error.URLError as e:
print(e)
except Exception as e:
print(e)
cookie & session
- 由于http协议的无记忆性,人们为了弥补这个缺憾,所采用的的一个补充协议
- cookie是发放给客户(即http浏览器)的一段信息,session是保存在服务器上对应的另一半信息,用来记录用户信息
- cookie和session的区别
- 存放位置不同
- cookie不安全
- session会保存在服务器上一定时间,会过期
- 单个cookie保存数据不超过4k,很多浏览器限制一个站点最多保存20个
- session的存放位置
- 存在服务端
- 一般情况,session是放在内存中或者数据库中
- 使用cookie登录
- 直接把cookie复制下来,然后手动放入请求头
- http模块包含一些关于cookie的模块,通过他们我们可以自动使用cookie
- CookieJar
- 管理存储cookie,向传出的Http请求添加cookie
- cookie存储在内库中,CookieJar实例回收后cookie将消失
- FileCookieJar(filename,delayload=None,policy=None)
- 使用文件管理cookie
- filename是保存cookie的文件
- MozillaCookieJar
- 创建与mozilla浏览器cookie.txt兼容的FileCookieJar实例
- LwpCookieJar
- 创建与libwww-perl标准兼容的Set-Cookie3格式的FileCookJar实例
- 他们的关系是:CookieJar–>FileCookieJar–>MozillaCookieJar & LwpCookieJar
- CookieJar
- cookie和session的区别
- handler是Handler的实例,常用参数案例:
- 用来处理复杂请求:
-
生成cookie的管理器
cookie_handler = request.HTTPCookieProcessor(cookie) -
创建http请求管理器
http_handler = request.HTTPHandler() -
生成https管理器
https_handler = request.HTTPSHandler()
-
- 创立handler后,使用opener打开,打开后相应的业务由相应的handler处理
- 用来处理复杂请求:
# 没有cookie案例,可以看到,没有使用cookie则反馈网页为未登录状态
from urllib import request
if __name__ == "__main__":
url = "http://www.renren.com/965187997/profile"
rsp = request.urlopen(url)
print(rsp.read().decode())
with open("rsp.html","w") as f:
f.write(html)
# 使用cookie登录,一般情况下可以登入进去
from urllib import request
if __name__ == "__main__":
url = "http://www.renren.com/965187997/profile""
headers = {
'cookie':'uuid_tt_dd=10_17345372890-1586250378297-983245; dc_session_id=10_1586250378297.482255; dc_sid=c3ce3079ece244a407693b04945e17c3; Hm_ct_6bcd52f51e9b3dce32bec4a3997715ac=6525*1*10_17345372890-1586250378297-983245!5744*1*weixin_45935720; __gads=ID=196a2d6d196fa927:T=1586250383:S=ALNI_MZU4J6olnW8vV9JNlWQM4AnxRAD6Q; c-toolbar-writeguide=1; c_ref=https%3A//www.baidu.com/link%3Furl%3DgfVTiNXbCbhGCkHDgxu0JJnh1Nupef2BtdZf_VrEEARpegm-6xs3zIsazprMkM_f9kQ5LAsTeHKK6euXqx5Fh0q3GXKp97rn9i0Z1r-f1ma%26wd%3D%26eqid%3D8a2d92b5002f3ab2000000035e8c59d1; Hm_lvt_6bcd52f51e9b3dce32bec4a3997715ac=1586069706,1586069915,1586250382,1586256372; SESSION=6e69097e-2e66-4938-abc8-525ab1622fb3; UserName=weixin_45935720; UserInfo=c234eda1036b4e389f645402240ffc3a; UserToken=c234eda1036b4e389f645402240ffc3a; UserNick=info_foo; AU=7F6; UN=weixin_45935720; BT=1586259045549; p_uid=U000000; announcement=%257B%2522isLogin%2522%253Atrue%252C%2522announcementUrl%2522%253A%2522https%253A%252F%252Fblog.youkuaiyun.com%252Fblogdevteam%252Farticle%252Fdetails%252F105203745%2522%252C%2522announcementCount%2522%253A0%252C%2522announcementExpire%2522%253A3600000%257D; Hm_lpvt_6bcd52f51e9b3dce32bec4a3997715ac=1586261385; dc_tos=q8f349'
}
req = request.Request(url,headers=headers)
rsp = request.urlopen(req)
html = rsp.read().decode('utf-8')
with open("rpo.html","w") as f:
f.write(html)
# 利用CookieJar访问人人网
'''
自动使用cookie登录,大致流程是:
1.打开登录页面后自动通过用户名密码登录
2.自动提取反馈回来的cookie
3.利用提取的cookie登录隐私页面
'''
from urllib import request,parse
from http import cookiejar
#创建cookiejar的实例
cookie = cookiejar.CookieJar()
#生成cookie的管理器
cookie_handler = request.HTTPCookieProcessor(cookie)
#创建http请求管理器
http_handler = request.HTTPHandler()
#生成https管理器
https_handler = request.HTTPSHandler()
opener = request.build_opener(http_handler,https_handler,cookie_handler)
def login():
'''
负责初次登录
需要输入用户名密码,用来获取登录cookie凭证
'''
# 此url需要从登录form的action属性中提取
url = "http://www.renren.com/PLogin.do"
# 此键值需要从登录form的两个对应input中提取name属性
data = {
"email":"13119144223",
"password":"123456"
}
#把数据进行编码
data = parse.urlencode(data)
#创建一个请求对象
req = request.Request(url,data=data.encode())
#使用opener发起请求
rsp = opener.open(req)
def getHomePage():
url = "http://www.renren.com/965187997/profile"
#如果已经执行了login函数,则opener自动已经包含相应的cookie值
rsp = opener.open(url)
html = rsp.read().decode('utf-8')
with open("rsp.html","w") as f:
f.write(html)
if __name__ == "__main__":
login()
getHomePage()
#cookie作为一个变量,打印出来
# 利用CookieJar访问人人网
'''
自动使用cookie登录,大致流程是:
1.打开登录页面后自动通过用户名密码登录
2.自动提取反馈回来的cookie
3.利用提取的cookie登录隐私页面
'''
from urllib import request,parse
from http import cookiejar
#创建cookiejar的实例
cookie = cookiejar.CookieJar()
#生成cookie的管理器
cookie_handler = request.HTTPCookieProcessor(cookie)
#创建http请求管理器
http_handler = request.HTTPHandler()
#生成https管理器
https_handler = request.HTTPSHandler()
opener = request.build_opener(http_handler,https_handler,cookie_handler)
def login():
'''
负责初次登录
需要输入用户名密码,用来获取登录cookie凭证
'''
# 此url需要从登录form的action属性中提取
url = "http://www.renren.com/PLogin.do"
# 此键值需要从登录form的两个对应input中提取name属性
data = {
"email":"13119144223",
"password":"123456"
}
#把数据进行编码
data = parse.urlencode(data)
#创建一个请求对象
req = request.Request(url,data=data.encode())
#使用opener发起请求
rsp = opener.open(req)
if __name__ == "__main__":
'''
执行完login之后,会得到授权之后的cookie凭证
我们尝试把cookie打印出来
'''
login()
print(cookie)
for item in cookie:
print(type(item))
print(item)
for i in dir(item):
print(i)
# cookie的保存-FileCookieJar
#cookie作为一个变量,打印出来
# 利用FileCookieJar访问人人网
'''
自动使用cookie登录,大致流程是:
1.打开登录页面后自动通过用户名密码登录
2.自动提取反馈回来的cookie
3.利用提取的cookie登录隐私页面
'''
from urllib import request,parse
from http import cookiejar
#创建cookiejar的实例
filename = "cookie.txt"
cookie = cookiejar.MozillaCookieJar(filename)
#生成cookie的管理器
cookie_handler = request.HTTPCookieProcessor(cookie)
#创建http请求管理器
http_handler = request.HTTPHandler()
#生成https管理器
https_handler = request.HTTPSHandler()
opener = request.build_opener(http_handler,https_handler,cookie_handler)
def login():
'''
负责初次登录
需要输入用户名密码,用来获取登录cookie凭证
'''
# 此url需要从登录form的action属性中提取
url = "http://www.renren.com/PLogin.do"
# 此键值需要从登录form的两个对应input中提取name属性
data = {
"email":"13119144223",
"password":"123456"
}
#把数据进行编码
data = parse.urlencode(data)
#创建一个请求对象
req = request.Request(url,data=data.encode())
#使用opener发起请求
rsp = opener.open(req)
#保存cookie到文件
#ignore_discard表示即使cookie将要被丢弃也要保存下来
#ignore_expires表示如果该文件中cookie即使已经过期,保存
cookie.save(ignore_discard=True,ignore_expires=True)
if __name__ == "__main__":
'''
执行完login之后,会得到授权之后的cookie凭证
我们尝试把cookie打印出来
'''
login()
SSL(SercureSockrtLayer)
- SSL证书就是指遵守SSL安全套接层协议的服务器数字证书
- 美国网景公司开发
- CA(CertifacateAuthority)是数字证书认证中心,是发放,管理,废除数字证书的收信人的第三方机构
- 遇到不信任的SSL证书,需要单独处理
- 忽略安全问题:
import ssl ssl.create_default_https_context =
ssl._create_unverified_context
JS加密
- 有的反爬虫策略采用js对需要传输的数据进行加密处理(通常是取md5值)
- 经过加密,传输的就是秘文,但是加密函数或者过程一定是在浏览器完成,也就是一定会把代码(js代码)暴露给使用者
- 通过阅读加密算法,就可以模拟出加密过程,从而达到破解
ajax
- 异步请求
- 一定会有url,请求方法,可能有数据
- 一般使用json格式
#爬取豆瓣电影剧情数据
from urllib import request
import json
url = 'https://movie.douban.com/j/chart/top_list?type=11&interval_id=100%3A90&action=&start=40&limit=20'
#使用head方法伪装UA
headers = {}
headers["User-Agent"] = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.11 TaoBrowser/2.0 Safari/536.11"
req = request.Request(url,headers=headers)
rsp = request.urlopen(req)
data = rsp.read().decode()
data = json.loads(data)
print(data)
Requests-献给人类
- HTTP for Hunmans,更简洁友好
- 继承了urllib的所有特征
- 底层使用的是urllib3
- 第三方,所以需要安装:pip install requests
- get请求
- requests.get(url)
- requests.request(“get”,url)
- 可以带有headers和params参数
- post
- rsp = requests.post(url,data=data)
- data,headers要求dict类型
- proxy
- 代理有可能报错,如果使用人数多,考虑安全问题,可能会被强行关闭
import requests
url = "http://www.baidu.com"
# 两种请求方式
rsp = requests.get(url)
print(rsp.text)
rsp = requests.request("get",url)
print(rsp.text)
#get案例,使用参数headers和params参数,get返回内容
import requests
url = "http://www.baidu.com/s?"
kw = {
"wd":"girl"
}
headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.11 TaoBrowser/2.0 Safari/536.11"
}
rsp = requests.get(url,params=kw,headers=headers)
print(rsp.text)
print(rsp.content)
print(rsp.encoding)
# post案例,少了parse.urlencode(data),urlopen,read,decode
'''
利用parse模块模拟post请求
分析百度词典
分析步骤:
1. 打开F12
2. 尝试输入单词girl,发现每敲一个字母后都有请求
3. 请求地址是 http://fanyi.baidu.com/sug
4. 利用NetWork-All-Heards查看,发现FormDate的值是 kw:girl
5. 检查返回内容格式,发现返回的是json格式==》需要用到json包
'''
import requests
# 负责处理json格式的模块
import json
'''
大致流程是:
1. 利用data构造内容,然后urlopen打开
2. 返回一个json格式的结果
3. 结果就应该是girl的释义
'''
baseurl = "http://fanyi.baidu.com/sug"
# 存放用来模拟form的数据一定是dict格式
data = {
#girl 是翻译输入的英文内容,应该是由用户输入,此处使用硬编码
'kw':"girl"
}
headers = {
#因为使用post模块对data进行编码,至少包含content-length字段
'Content-Length': str(len(data))
}
req = requests.post(url=baseurl,data=data,headers=headers)
print(req.text)
print(req.json())
#proxy案例
import requests
if __name__ == "__main__":
url = "http://www.baidu.com"
#1.设置代理地址
proxy = {'http':'101.4.136.34:81'}
#2. 创建ProxyHandler
proxy_handler = request.ProxyHandler(proxy)
#3. 创建Opener
opener = request.build_opener(proxy_handler)
#4. 安装Opener
request.install_opener(opener)
#现在如果访问url,则使用代理服务器
# rsp = requests.request("get",url,proxies=proxy)
rsp = requests.get(url,proxies=proxy)
print(rsp.text)
用户验证
- 代理验证
- 可能需要使用HTTP basic Auth,格式为:
- 用户名:密码@代理地址:端口地址
- 可能需要使用HTTP basic Auth,格式为:
proxy = {“http”:"tianhao:123456@“101.4.136.34:81”}
rsp = requests.get(“http://www.baidu.com”,proxies=proxy)
- web客户端验证
- 如果遇到web客户端验证,需要添加auth=(用户名,密码)
auth = (“text1”,“123456”) #授权信息
rsp = requests.get(“http://www.baidu.com”,auth=auth)
动态HTML
爬虫跟反爬虫
动态HTML介绍
- JavaScript
- jQuery
- Ajax
- DHTML
- Python采集动态数据
- 从JavaScript代码入手采集
- Python第三方库运行JavaScript,直接采用你在浏览器看到的页面
Selenium + PhantomJS
- Selenium: web自动化测试工具
- 自动加载页面
- 获取数据
- 截屏
- 安装:pip install selenium==2.48.0
- PhantomJS(幽灵)
- 基于Webkit 的无界面的浏览器
- 安装:官网下载
- Selenium 库有一个WebDriver的API
- WebDriver可以跟页面上的元素进行各种交互,用它可以进行爬虫
#通过WebDriver操作
from selenium import webdriver
#通过Keys模拟键盘
from selenium.webdriver.common.keys import Keys
# 操作哪个浏览器就对哪个浏览器建一个实例
# 自动按照环境变量查找相应的浏览器
driver = webdriver.PhantomJS()
# 如果浏览器没有在相应环境变量中,需要指定浏览器位置
driver.get("http://www.baidu.com")
# 通过函数查找title标签
print("Title:{0}:".format(driver.title))
Chrome + Chromedriver(驱动)
- 下载安装Chrome
- 下载安装Chromedriver
- Selenium操作主要分为两大类:
-
得到UI元素
- find_element_by_id
- find_elemen_by_name
- find_element_by_xpath
- find_element_by_link_text
- find_element_by_partial_link_text
- find_element_by_tag_name
- find_element_by_class_name
- find_element_by_css_selector
-
基于UI元素操作的模拟
- 单击
- 右键
- 拖拽
- 输入
- 可以通过导入ActionChains类来做
-
from selenium import webdriver
import time
from selenium.webdriver.common.keys import Keys
# 可能需要手动添加路径
driver = webdriver.Chrome()
url = "http://www.baidu.com"
driver.get(url)
text = driver.find_element_by_id("wrapper").text
print(text)
print(text.title)
# 得到页面的快照
driver.save_screenshot("index.png")
# id="kw"是百度的输入框,我们得到输入框的UI元素后直接输入大熊猫
driver.find_element_by_id("kw").send_keys(u"哈士奇")
# id="su"是百度搜索的按钮,click模拟点击
driver.find_element_by_id('su').click
time.sleep(5)
driver.save_screenshot("hashiqi.png")
# 获取当前页面的cookie
print(driver.get_cookies())
# 模拟输入两个按键 ctrl + a
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'a')
# ctrl + x ,是剪切快捷键
driver.find_element_by_id('kw').send_keys(Keys.CONTROL,'X')
driver.find_element_by_id('kw').send_keys(u'航空母舰')
driver.save_screenshot("hkmj.png")
driver.find_element_by_id('su').send_keys(Keys.RETURN)
time.sleep(5)
driver.save_screenshot("hkmj2.png")
# 清空输入框,clear
driver.find_element_by_id('kw').clear
driver.save_screenshot("clear.png")
# 关闭浏览器
driver.quit()