python---网络爬虫01

#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) #只是打印了这么一点<http.client.HTTPResponse object at 0x000001CC26CB59E8>
# #因为拉钩的服务器识别出了这是一个爬虫程序
#
# #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 晚 马上会宿舍洗衣服了。。。






posted @ 2018-12-14 22:05  兵临城下的匹夫  阅读(292)  评论(0编辑  收藏  举报
TOP