#Author:'haijing' #date:2018/12/14 #使用urlopen打开一个网页 # from urllib import request # resp = request.urlopen('http://www.baidu.com') #resp为网页返回的数据,是一个文件句柄格式 # print(resp.read()) # print(resp.read(10)) #读取是个字节 # print(resp.readline()) #读取一行 # print(resp.readlines()) #读取多行 # print(resp.getcode()) #获取状态码 # from urllib import request # request.urlretrieve('http://www.baidu.com','baidu.html') #将百度这个网页下载到baidu.html文件中 #编码 # from urllib import request # from urllib import parse # params = {'name':'zhangsan','age':'18','greet':'hello world'} # result = parse.urlencode(params) #对params这个字典进行编码 # print(result) #name=zhangsan&age=18&greet=hello+world # # # url = 'http://www.baidu.com/s?wd=刘德华' # url = 'http://www.baidu.com/s' # params = {'wd':'刘德华'} # result = parse.urlencode(params) #对wd=刘德华进行编码 # print(result) #wd=%E5%88%98%E5%BE%B7%E5%8D%8E # url = url+"?"+result # resp = request.urlopen(url) #打开http://www.baidu.com/s?wd=刘德华 这个网页,但是打开之前必须对汉字进行编码 # print(resp) #编码和解码 # params = {'name':'zhangsan','age':'18','greet':'hello world'} # result = parse.urlencode(params) #对params这个字典进行编码 # print(result) #name=zhangsan&age=18&greet=hello+world # result = parse.parse_qs(result) #对result进行解码 # print(result) #{'name': ['zhangsan'], 'age': ['18'], 'greet': ['hello world']} #解析,将一个网址分开 # url = 'http://www.baidu.com/s?wd=python$username=abc#1' # result1 = parse.urlparse(url) # print(result1) #ParseResult(scheme='http', netloc='www.baidu.com', path='/s', params='', query='wd=python$username=abc', fragment='1') # #scheme:协议 netloc:为域名 query:查询参数 fragment:锚点 # print(result1.scheme) #http # print(result1.netloc) #www.baidu.com # print(result1.query) #wd=python$username=abc # # result2 = parse.urlsplit(url) #这个分割出来的参数没有 params='' 这一项,用的很少 # print(result1) #ParseResult(scheme='http', netloc='www.baidu.com', path='/s', params='', query='wd=python$username=abc', fragment='1') # print(result2) #SplitResult(scheme='http', netloc='www.baidu.com', path='/s', query='wd=python$username=abc', fragment='1') #一个简单爬虫的例子 # from urllib import request # from urllib import parse # # url = 'https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput=' # #真正的数据请求回来的url在positionAjax.json中,复制网页->右击->点击检查->选择positionAjax.json,复制Request URL下的url # url = 'https://www.lagou.com/jobs/positionAjax.json?city=%E6%9D%AD%E5%B7%9E&needAddtionalResult=false' # resp = request.urlopen(url) # print(resp) #只是打印了这么一点# #因为拉钩的服务器识别出了这是一个爬虫程序 # # #User-Agent和Referer都是网页中检查中positionAjax.json中的数据,User-Agent和Referer是两个请求头 # headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36', # 'Referer':'https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput='} #网页中复制出来的 # data = {'first':'true','pn':'1','kd':'python'} #网页下检查中positionAjax.json的From data下的数据,不知道是啥意思,直接写上就好了 # data = parse.urlencode(data) #将data进行编码 # data = data.encode('utf-8') #将data在python3中默认为的unicode字符串,现在将它转换为bytes类型 # req = request.Request(url,headers=headers,data=data,method='POST') #只是创建好了req这么一个对象,post请求也是在positionAjax.json中的到的 # resp = request.urlopen(req) #正常的网页数据 # # print(resp.read()) #这样是复制到www.json.cn下是看不到具体的信息的 # print(resp.read().decode('utf-8')) #这样将打印出来的东西,复制到www.json.cn编辑页面下,在页面的右侧即可看到招聘的信息 #ProxyHandler代理服务器 #如果百度服务器检查到同一个ip在一分钟之内去了100多次,那么百度服务器就会把这个ip地址加入黑名单 #如果192.168.11是一个爬虫的ip地址,一般是直接去访问百度的服务器,但是为了防止被加入黑名单 #爬虫的ip地址可以先去访问代理服务器,通过代理服务器再去访问百度服务器,代理服务器可以将网站的数据转发给我们的代码 # from urllib import request # handler = request.ProxyHandler({'http':'218.66161.88:31769'}) # #218.66161.88为代理服务器的ip地址,31769为端口号 # opener = request.build_opener(handler) #发送请求 # req = request.Request('http://www.baidu.com') # resp = opener.open(req) # print(resp.read) #常用的代理有:(但是免费无好货,免费响应速度比较慢) # 西刺代理IP:http://www.xicidaili.com # 快代理:http://www.kuaidiali.com/ # 代理云: http://www.dailiyun.com # http://httpbin.org/ip 刚刚打开时,网页初始显示的是本机电脑对应的外网的ip地址+ # #应用快代理网站中的免费的ip来获取数据 # from urllib import request # #没有使用代理的 # url = 'http://httpbin.org/ip' # resp = request.urlopen(url) # print(resp.read()) #b'{\n "origin": "60.191.32.72"\n}\n' # #使用代理的 # #使用ProxyHandler,传入快代理创建一个handler # handler = request.ProxyHandler({'http':'115.223.225.255:9000'})#http为协议,115.223.225.255为ip,9000为端口号 # #使用上面创建的handler船舰一个opener # opener = request.build_opener(handler) # #使用opener发送一个请求 # resp = opener.open(url) #即可使用这个代理的ip去打开一个url # print(resp.read()) #b'{\n "origin": "115.223.225.255"\n}\n' # cookie #浏览器第一次去访问服务器的时候,服务器会根据浏览器的某个信息,给这个浏览器 #一个特定的标志,这个标志就是cookie信息,并保存在浏览器中,下一次这个浏览器再次去访问服务器的时候 #服务器就会识别出浏览器的cookie信息,是被出你是上一个用户 #cookie一般不超过4KB,可以指定过期时间 #cookie信息存放在Response Headler中,一般是有三个Set-Cookie # from urllib import request # #不使用cookie信息去请求 # dapeng_url = 'http://www.renren.com/880151247/profile' # #为安全起见,设置信息头,此处的User-Agent信息是在大鹏的主页下随便找到的一个User-Agent, # # 也可以不加Referer这样安全度就降低了 # headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36'} # req = request.Request(dapeng_url,headers=headers) # resp = request.urlopen(req) # # print(resp.read().decode('utf-8')) #这样太麻烦,下面直接写入一个文件中去 # with open('renren.html','w') as fp: #如果没有renren.html这个文件,那么去创建这么一个文件出来 # #由于write()函数必须写入一个str类型的数据 # #而resp.read().decode('utf-8')是bytes类型的数据 # #bytes->解码(decode)->str # #str->编码(encode)->bytes # #由bytes到str叫解码,实现方法有两种 # # 1) s1 = str(b1,'utf8') # # 2) s2 = b1.decode('utf8') # fp.write(resp.read().decode('utf8')) #用浏览器打开renren.html后需要登录,因为没有用cookie信息 # # 用cookie模拟登录,即操作cookie信息 # from urllib import request # # 使用cookie信息去请求 # dapeng_url = 'http://www.renren.com/880151247/profile' # # 为安全起见,设置信息头,此处的User-Agent信息是在大鹏的主页下随便找到的一个User-Agent, # # 也可以不加Referer这样安全度就降低了,其中Cookie大小写要和网页中的写法一样 # headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36', # 'Cookie':'anonymid=jpnsdcuv2bxma9; depovince=GW; _r01_=1; JSESSIONID=abcn0AoH5_evkcSMY4REw; ick_login=aa1ed48e-7727-4a1a-b9c3-acf39c2db071; t=94e08ee2e45841b2ac45155840a517c79; societyguester=94e08ee2e45841b2ac45155840a517c79; id=969115829; xnsid=541c8f77; ch_id=10016; jebe_key=792befd5-ca5a-4646-92b1-f627ab16d171%7C7f881153cde82b384c33be303f429a1a%7C1544777076411%7C1%7C1544777075839; wp_fold=0; td_cookie=18446744070618030523; jebecookies=62a1ad4a-207b-48b6-b21d-bc55eb94aaef|||||'} # req = request.Request(dapeng_url, headers=headers) # resp = request.urlopen(req) # # print(resp.read().decode('utf-8')) #这样太麻烦,下面直接写入一个文件中去 # with open('renren.html', 'w') as fp: # 如果没有renren.html这个文件,那么去创建这么一个文件出来 # fp.write(resp.read().decode('utf8')) # 此时用浏览器打开renren.html即是大鹏的主页,包括自己的登录信息 # # http.cookiejar模块 实现网页的自动登录,但是需要在代码中输入账户和密码 # from urllib import request # from urllib import parse #这一个是编码和解码用的 # from http.cookiejar import CookieJar # #1登录 # #1.1创建一个cookiejar对象 # cookiejar = CookieJar() #CookieJar()会保存下面会用到的cookie信息,并将此信息传给下面的handler # #1.2使用cookiejar创建一个HTTPCookieProcess对象 # handler = request.HTTPCookieProcessor(cookiejar) # #1.3使用上一步创建的handler创建一个opener # opener = request.build_opener(handler) # #1.4使用opner发送登录的请求(人人网的邮箱和密码) # headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36'} # data = {'email':'970138074@qq.com','password':'pythonspider'} #登录的账户名和密码 # data = parse.urlencode(data) #此时data是一个unicode的字符串,需改成bytes类型的 # data = data.encode('utf8') # login_url = 'http://www.renren.com/PLogin.do' #登录的页面的网址 # req = request.Request(login_url,data=data,headers=headers) # opener.open(req) #发送请求,以上都是准备 # #2访问主页 # dapeng_url = 'http://www.renren.com/880151247/profile' # #获取个人页面的时候,不用新建一个opener # #而是用之前的那个opener即可,因为之前的那个opener已经包含了登录所需要的cookie信息 # req = request.Request(dapeng_url,headers=headers) # resp = opener.open(req) # resp = resp.read().decode('utf-8') #解码 # with open('renren02.html','w',encoding='utf-8') as fp: # fp.write(resp) # #生成cookie信息并保存到本地,并且重新加载进来 # from urllib import request # from http.cookiejar import MozillaCookieJar # # cookiejar = MozillaCookieJar('cookie.txt') #将cookie信息保存到cookie.txt文件下 # handler = request.HTTPCookieProcessor(cookiejar) # opener = request.build_opener(handler) # resp = opener.open('http://www.baidu.com/') #执行完这一句(即打开了百度的网页)即将cookie信息保存到了cookie.txt文件下 # #但是此代码关闭之后,cookie信息就会失效,故在下面的语句中加入参数,以此cookie信息不会失效 # cookiejar.save(ignore_discard=True) #将cookie.txt保存到本地,和本py问价在同一个路径下 # # #将那些已经过期了的cookie信息加载进来,必须使用参数ignore_discard=True # cookiejar.load('cookie.txt',ignore_discard=True) #加载cookie.txt中的cookie信息,如果上边有cookie.txt这个名字,那么也可以不用写 # for i in cookiejar: # print(i) # requests模块 需要安装,但是在anaconda下不需要自己就给装上了 # import requests # response = requests.get('http://www.baidu.com') #response即是百度服务器传送过来的网站的源代码 # print(response.text) #服务器返回的unicode字符串,但是由于下面的解码使用自动的解码方式,所以可能会有乱码 # print(response.content) #服务器返回的bytes类型的数据(抓取的数据),经过解码后存储到text中 # print(response.content.decode('utf8')) #以utf8方式进行手动解码 # print(response.url) #当前请求的url:http://www.baidu.com/ # print(response.encoding) #当前编码的方式:ISO-8859-1 # print(response.status_code) #状态码:200 # #requests发送get请求 # import requests # params = {'wd':'中国'} # #这个User-Agent是在百度中国下->检查->ctrl+r->随便点击一个找到User-Agent然后复制过来的 # headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36'} # #在http://www.baidu.com/s的后面添加上中国两个搜索的条件 # response = requests.get('http://www.baidu.com/s',params=params,headers=headers) # with open('baidu.html','w',encoding='utf-8') as fp: # fp.write(response.content.decode('utf-8')) # print(response.url) #http://www.baidu.com/s?wd=%E4%B8%AD%E5%9B%BD,其中wd=%E4%B8%AD%E5%9B%BD就是wd=中国 haijing in HZ miss home 2018.12.14 晚 #---------------------补充----------------------#
#利用requests发送POST请求 # import requests # data = {'first':'true','pn':'1','kd':'python'} #网页中的数据,pn表示第几页 kd表示查询的关键字 # headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36', # 'Referer':'https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput=' # } # reponse = requests.post('https://www.lagou.com/jobs/positionAjax.json?city=%E6%9D%AD%E5%B7%9E&needAddtionalResult=false', # data=data,headers=headers) # # print(reponse.text) #打印字符串格式 # print(reponse.json()) #利用response.cookies方法获取cookie信息 # import requests # response = requests.get('http://www.baidu.com') # res = response.cookies #拿到百度网页中的cookie信息 # res = res.get_dict() #转换为字典格式的 # print(res) #打印cookie信息 #利用session方法来保存登录信息,以后直接用这个响应来获取必须登录才能得到的页面 ***** # import requests # headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36'} # login_url = 'http://www.renren.com/PLogin.do' #登录的页面的网址 # data = {'email':'970138074@qq.com','password':'pythonspider'} #登录的账户名和密码 # session = requests.session() # session.post(login_url,data=data,headers=headers) # # respons = session.get('http://www.renren.com/880151247/profile') #此时的session就是保存登录信息了,故可以用这个响应session来直接去访问大鹏的页面 # with open('renren03.html','w',encoding='utf-8') as fp: # fp.write(respons.text) # #如果www.12306.cn/mormhuwe是一个需要验证的网站,只需要在网站后面加上verify=False即可,即 # resp = response.get('http://www.12306.cn/mormhuwe,verify=False') #就可以正常打开 haijing in HZ 今天重新看了一遍 西游降魔篇 昨天 今天过去不再回来,从前直到现在 爱还在 2018.12.15 晚 马上会宿舍洗衣服了。。。