python—【爬虫】学习_1(基本知识篇)

首先介绍下urllib的用法

urllib提供了一系列用于操作URL的功能。

常用的模块:

urllib.request 请求模块
urllib.error 异常处理模块
urllib.parse url解析模块

request()

urllib的ruquest模块可以非常方便地抓取URL内容,也就是发送一个GET请求到指定的页面,然后返回HTTP的响应:

from urllib import request
response = request.urlopen("https://www.baidu.com/")

.read() 每次读取整个文件,它通常用于将文件内容放到一个字符串变量中。

html =response.read()

然而这是远远不够的,因为返回值是以二进制存储的,一般网页原码都是用utf-8表示,所以一般还有一个decode()的过程。

html =html.decode("utf-8")
print(html)

得到以下输出:

<html>

<head>

	<script>

		location.replace(location.href.replace("https://","http://"));

	</script>

</head>

<body>

	<noscript><meta http-equiv="refresh" content="0;url=http://www.baidu.com/"></noscript>

</body>

</html>

具体例子1:(下载一只小猫)来源网站:placekitten.com

code如下:

from urllib import request as re
response =re.urlopen("http://placekitten.com/g/500/600")
cat_img = response.read()

with open("D:\\实验楼\cat_500_600.jpg", 'wb')as f:
    f.write(cat_img)

.Parse()

这里就用到urllib.parse,通过bytes(urllib.parse.urlencode())可以将post数据进行转换放到urllib.request.urlopen的data参数中。这样就完成了一次post请求。
所以如果我们添加data参数的时候就是以post请求方式请求,如果没有data参数就是get请求方式。

具体例子2:使用有道翻译进行翻译.

from urllib import request
from urllib import parse
import json

content = input("请输入需要翻译的内容")

url ="http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule"


head ={ }
head['User-Agent']='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'

data ={}
data["from"]="AUTO"
data["to"]="AUTO"
data["i"]= content
data["client"]="fanyideskweb"
data["sign"]="c8f3a6d3a2e68a5ba21a0c36de9ed9cd"
data["salt"]="1539962031171"
data["smartresult"]="dict"
data["doctype"]="json"
data["version"]= 2.1
data["keyfrom"]="fanyi.web"
data["action"]="FY_BY_REALTIME"
data["typoResult"]= "false"

data = parse.urlencode(data).encode("utf-8")
##是将一个utf-8类型的字符串url,解码成ascii格式的方法
#urllib.parse.urlencode()
#只将连接中utf-8编码不在ascii表中的字符翻译成带百分号的ascii表示形式
#>>>params = {'query':'中文','submit':'search'}
#>>>data = urllib.parse.urlencode(params)
#>>>data
#'query=%E4%B8%AD%E6%96%87&submit=search'
req = request.Request(url,  data , head)
response = request.urlopen(req)

# or 删去Request中的head
# +  req.add_header(“User-Agent”,'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36')
html = response.read().decode('utf-8')

target = json.loads(html)
#json.loads 用于解码 JSON 数据。该函数返回 Python 字段的数据类型。
res= target['translateResult'][0][0]['tgt']
print ("翻译结果为:",res)

代理ip的使用方法:

1、build_opener 和urlopen的区别和优点?

答:要爬取的各种各样的网页,它们有一部填写需要验证码,有的需要小饼干(cookie),还有更多许多高级的功能,它们会阻碍你爬,而我对于urlopen单纯地理解就是打开网页。urlopen打开一个网址,它可以是一个字符串或者是一个request对象。而build_opener就是多了handler,处理问题更专业,更个性化。

2、使用默认的handlers应该怎么写?

例子1:

ProHandler=
request = urllib.request.Request(url,data, headers or {})

iplist =['119.6.144.73:81',...........]

proxy_support =urllib.request.ProxyHandler({'http':random.choice(iplist)})
opener = urllib.request.build_opener(support)
例子2:
opener1 = urllib.request.install_opener(opener)

猜你喜欢

转载自blog.csdn.net/qq_35962520/article/details/83112783