python-网络爬虫
基础网络知识
json(轻量级的数据交换格式。。没有带s的方法都是涉及到文件的操作)
一、json.dumps(i): 将特定格式的数据进行字符串化的操作
比如列表字典都可以进行字符串化操作然后写入json的file;而且如果是要写入json文件就必须要进行dumps操作;
二、json.dump():将数据转换成str格式,添加了将数据写入json文件的一个操作步骤
son.dump(data, file-open,ascii=False),可以包含三个属性,第三个ascii是用来避免出现unicode写入的乱码的;
三、json.loads():将字符型数据转换成原来的数据格式,诸如列表和字典
四、json.load():从json文件中读取数据,json.load(file-open)即可,这样可以还原在json文件中的原本的数据格式,诸如列表或者字典;file在open的时候最好是注意用encoding=‘utf-8’的编码,这样出来的数据就是原来的数据,而不会出现乱码;
URL(Uniform Resource Locator,统一资源定位符):网络地址
URL格式:protocol:// hostname[:port] /path/[;parameters] [?query]#fragment
中括号为可选选
第一部分是协议:http、https、ftp、file
第二部分是存放资源的服务器的域名系统或IP地址(有时候要包含端口号,各种传输协议都有默认的端口号,http默认为80)
第三部分是资源的具体位置(如目录或文件名)
urllib包(url+lib,主要使用parse和request模块)
parse模块
urlencode():将字典转换为url格式
request模块
urlopen(url,)data=None):打开URL网址,返回响应对象(http.client.HTTPResponse对象)
url参数可以是一个字符串url或者是一个Request对象
data为None时用get获取,data赋值时为post提交
响应对象大概包括read()、readinto()、getheader()、getheaders()、fileno()、msg、version、status、reason、debuglevel和closed函数,
使用read()函数 返回未解码的网页内容(如字节流或图片)
read()得到内容后用decode()函数使用对应的解码方式,返回相应的对象(如utf-8 返回字符串)
geturl()、getcode()获取响应频率、info()
Request:信息更完善的请求对象,包括headers(请求头)等信息
request = urllib.request.Request(url = url,data = data, /
headers = headers,method = 'POST')
data参数要求bytes(字节流)类型,如果是一个字典,先用urllib.parse.urlencode()编码。
data为空,method默认为get。data不为空,method默认为post
data = urllib.parse.urlencode(字典).encode('utf-8')
网站检查
method(network-status右键显示method,再点击一次按钮类请求):
post(提交):向指定服务器提交被处理的数据
headers:
1)General:
远程地址(端口号)、请求地址(url),请求方法(post)
2)Request Headers:
通过User-Agent来判断是否是浏览器访问(或是代码访问)
3)From data(表单数据):post提交的主要内容
get(获取):是指服务器请求获得数据
隐藏(修改Headers)
1)通过Request的headers参数修改
2)通过Request.add_header(key,value)方法修改
一个请求修改User-Agent
初版隐藏:
#伪装 从User-Agent得知
header={"User-Agent":" Mozilla/5.0 (Windows NT 6.1; Win64; x64) "}
#封装
response=request.Request(url=base_url,headers=header,data=data_str)
#创建一个Request对象
req=request.urlopen(response).read().decode("utf-8")
#响应对象,read成网页内容,decode返回req字符串
网页爬取与代理
未解码版:
import urllib.request as r
response = r.urlopen('http://www.fishc.com')
response.read()
代理(用多个其他的服务器IP访问网页,并获取数据)
1.参数是一个字典{‘类型’,‘代理ip:端口号’}
键:代理类型(如http) 值:对应的IP
proxy_suppot = urllib.request.ProxyHandler({})
2.定制和创建一个opener
opener = urllib.request.build_opener(proxy_support)
平常的访问也是调用了opener,在这里我们定制一个opener,用代理ip去访问网页
3.安装opener(永久用代理) urllib.request.install_opener(opener)
4.调用opener(使用特殊的opener来打开网页)
opener.open(url)
初版代理:
import urllib.request as r
url='https://www.kuaidaili.com/free/'
proxy_support = r.ProxyHandler({'http':'58.22.177.200:9999'})
opener = r.build_opener(proxy_support)
r.install_opener(opener)
response = r.urlopen(url)
html = response.read().decode('utf-8')
print(html)
初版代理+隐藏
opener.addheaders[(key,value)]
例如:opener.addheaders[('User-Agent','*************')]
网页内容下载
图片下载初版:
import urllib.request as r
req =r.Request('http://placekitten.com/g/500/600')
response = r.urlopen(req)
cat_img = response.read()
with open('cat_500_600.jpg','wb') as f:
f.write(cat_img)
# fp=open(文件)等同于 with open(文件名) as fp
requests模块(Python第三方库,处理URL资源更方便)
https://www.cnblogs.com/lei0213/p/6957508.html
requests是用python语言基于urllib编写的,采用的是Apache2 Licensed开源协议的HTTP库,requests比urllib更加方便
request支持HTTP连接保持和连接池,支持使用cookie保持会话,支持文件上传,支持自动响应内容的编码,支持国际化的URL和POST数据自动编码。
requests.get()
requests.get(url,params = None,headers = None,cookies = None,auth = None,timeout =无)
发送GET请求。 返回response对象。
参数:
url - 新的Request对象的URL。
params - (可选)使用请求发送的GET参数字典。(如需要的data数据)
头文件headers - (可选)使用请求发送的HTTP头文件字典。
如 : headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) ' }
Cookie - (可选)使用请求发送的CookieJar对象。
auth - (可选)AuthObject启用基本HTTP身份验证。
超时 - (可选)描述请求超时的浮点数。
不带参数:requests.get(url)
带参数:requests.get(url=? params=字典 # 带参数的get请求
请求方式
requests.post("http://httpbin.org/post")
requests.put("http://httpbin.org/put")
requests.delete("http://httpbin.org/delete")
requests.head("http://httpbin.org/get")
requests.options("http://httpbin.org/get")
requests.post()
A:application/x-www-form-urlencoded ==最常见的post提交数据的方式,以form表单形式提交数据
url = 'http://httpbin.org/post'
data = {'key1':'value1','key2':'value2'}
r =requests.post(url,data)
B:application/json ==以json格式提交数据
url_json = 'http://httpbin.org/post'
data_json = json.dumps({'key1':'value1','key2':'value2'})
#dumps:将python对象解码为json数据
r_json = requests.post(url_json,data_json)
C:multipart/form-data ==一般使用来上传文件(较少用)
url = 'http://httpbin.org/post'
files = {'file':open('E://report.txt','rb')}
r = requests.post(url,files=files)
response模块(requests.response)
是requests.reponse 对象
打印response:<Response [200]>
request.content与request.text
response.text :返回的是一个 unicode 型的文本数据 (可能是str类型),通常需要转换为utf-8格式,否则就是乱码
response.enconding = "utf-8'
response.content :返回的是 bytes 型的二进制数据 (取图片,视频,文件),
直接写入不需要解码,想看的话需要decode成utf-8格式。
response.content.decode()
返回utf-8的字符串(可能是按照默认解码方式)
response是一个响应对象,post也有内容
response.json()
等同于json.loads(response.text)方法 (字符串转换成字典)
内在属性
cookie的一个作用就是可以用于模拟登陆,做会话维持
#打印请求页面的状态(状态码)
print(type(response.status_code),response.status_code)
#打印请求网址的headers所有信息
print(type(response.headers),response.headers)
#打印请求网址的cookies信息
print(type(response.cookies),response.cookies)
#打印请求网址的地址
print(type(response.url),response.url)
#打印请求的历史记录(以列表的形式显示)
print(type(response.history),response.history)
#解码方式
response.encoding
状态码200正常:
#如果response返回的状态码是非正常的就返回404错误
if response.status_code != requests.codes.ok:
print('404')
#如果页面返回的状态码是200,就打印下面的状态
response = requests.get('http://www.jianshu.com')
if response.status_code == 200:
print('200')
代理
1、设置普通代理
import requests
proxies = {
"http": "http://127.0.0.1:9743",
"https": "https://127.0.0.1:9743",
}
response = requests.get("https://www.taobao.com", proxies=proxies)
print(response.status_code)
2、设置用户名和密码代理
import requests
proxies = {
"http": "http://user:[email protected]:9743/",
}
response = requests.get("https://www.taobao.com", proxies=proxies)
print(response.status_code)
设置socks代理
安装socks模块 pip3 install ‘requests[socks]’
import requests
proxies = {
'http': 'socks5://127.0.0.1:9742',
'https': 'socks5://127.0.0.1:9742'
}
response = requests.get("https://www.taobao.com", proxies=proxies)
print(response.status_code)
超时设置
通过timeout参数可以设置超时的时间
import requests
from requests.exceptions import ReadTimeout
try:
# 设置必须在500ms内收到响应,不然或抛出ReadTimeout异常
response = requests.get("http://httpbin.org/get", timeout=0.5)
print(response.status_code)
except ReadTimeout:
print('Timeout')
认证设置
如果碰到需要认证的网站可以通过requests.auth模块实现
import requests
from requests.auth import HTTPBasicAuth
<br>#方法一
r = requests.get('http://120.27.34.24:9001', auth=HTTPBasicAuth('user', '123'))<br>
#方法二<br>r = requests.get('http://120.27.34.24:9001', auth=('user', '123'))
print(r.status_code)
证书
在请求https时,request会进行证书的验证,如果验证失败则会抛出异常
关闭证书验证:
import requests
# 关闭验证,但是仍然会报出证书警告
response = requests.get('https://www.12306.cn',verify=False)
print(response.status_code)
消除验证证书的警报:
from requests.packages import urllib3
import requests
urllib3.disable_warnings()
response = requests.get('https://www.12306.cn',verify=False)
print(response.status_code)
手动设置证书:
response = requests.get('https://www.12306.cn', cert=('/path/server.crt', '/path/key'))
print(response.status_code)