1、urllib.request模块
1.1版本
python2 :urllib2、urllib
python3 :把urllib和urllib2合并,urllib.request进化为requests
身为一个爬虫工程师肯定要与时俱进用requests但是一些老公司的框架仍然是python2,一些功能成型后就没必要修改了所以还是要了解python2的常用方法,毕竟谁知道未来会发生什么呢
1.2常用方法
常用的保存图片的方法
from urllib.request import urlretrieve
urlretrieve(url,fiename)
①urllib.request.urlopen(“⽹址”)
作⽤ :向⽹站发起⼀个请求并获取响应
②result = response.read()
result是字节流<class ‘bytes’>(通过type(result)可以查看它的类型)经过解码后的字符
③result = response.read().decode(“utf-8”)
为了看懂所以我们要解码将字节流转化为字符串用decode解码查看类型是字符串了<class ‘str’>
④response = urllib.request.Request(“⽹址”)这就相当于人点击网址查看信息一样,将response打印出来就可以看到所要的结果
注意百度也做了一个小反爬如果直接用
response = urllib.request.Reques('https://www.baidu.com')
是得不到数据的要加上ua才能得到数据
response = urllib.request.Reques('https://www.baidu.com',headers={'User-Agen't: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36'})
1.3响应对象
read() 读取服务器响应的内容
getcode() 返回HTTP的状态码 (200表示成功)
geturl() 返回实际数据的URL(防⽌重定向问题)
2、urllib.parse模块
2.1两种解码方式
① urlencode(字典) 将文字解码为16进制字符串拼接(URL)
import urllib.parse
r = {'wd':'海贼王'}
r = urllib.parse.urlencode(r)
print(r)
②quote(字符串) 将字符解码为16进制字符串拼接(URL)
import urllib.parse
key = input('请输入内容:')
r = urllib.parse.quote(key)
print(r)
3、请求方法
3.1 get
response = urllib.request.Request(url,headers=headers)
data = urllib.requests.urlopen(url or response)
result = read().decode(‘utf-8’)
3.2 post,data数据必须是字节流的类型
先 data = urllib.parse.urlencode(data):转化为字符串类型,
在将字符串data = bytes(data,‘utf-8’)转化为字节流
3.2.1urllib通过post制作有道词典翻译程序
import urllib.request
import urllib.parse
import json
key = input('请输入你想翻译的内容:')
url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36'
}
data = {
'i': key,
'from': 'AUTO',
'smartresult': 'dict',
'client': 'fanyideskweb',
'salt': '15880623642174',
'sign': 'c6c2e897040e6cbde00cd04589e71d4e',
'ts': '1588062364217',
'bv': '42160534cfa82a6884077598362bbc9d',
'doctype': 'json',
'version': '2.1',
'keyfrom':'fanyi.web',
'action': 'FY_BY_CLICKBUTTION'
}
data = urllib.parse.urlencode(data)
data = bytes(data,'utf-8')
response = urllib.request.Request(url,data=data,headers=headers)
response = urllib.request.urlopen(response)
html = response.read().decode('utf-8')
dict = json.loads(html)
result = dict["translateResult"][0][0]["tgt"]
print(result)
4、requests模块
安装pip install requests
4.2requests的快速入门
wd = {‘wd’:‘中国’}
response = requests.get(url,params=wd,headers=headers)直接拼接字符串
print(response.text)str数据类型是先经过content获取数据后requests自动编码可能会乱码。
去除乱码的两种方式
①res.encodeing=‘utf-8’;
②res.content.decode(‘utf-8’)
print(type(response.content))bytes数据类型还未经过编码
4.3get 和post请求
requests.get(url,headers = headers,cookies=cookies)
requests.post(url,data=data,headers=headers)
4.4requests设置代理ip
4.4.1为什么设置代理ip
爬虫爬取速度过快,造成违规操作被封号,如果用代理,则会分担单个ip的访问压力,模拟多个浏览器访问服务器,服务器不知道你是一个爬虫,避免封号风险(即使封号了也没关系,只是限制你的ip访问你爬取的服务器,你还可以正常访问其它的服务器,过个35天他就会恢复你的访问权限,但再次爬的时候要小心,因为该服务器的监控员可能把你的ip列入高危或者限制ip你就要准备的更加充分才敢爬取他的数据,如果你老是被同一个服务器封,他可能会永久封你的ip那你就凉凉(不过也没关系封的只是外网ip换个网照样爬取嘿嘿嘿))
4.4.2怎样设置代理ip
proxy = {
'http':'210.5.10.87:53281'
}
res = requests.get(url,proxies=proxy)
可以多设置几个用random模块随机选择ip爬取,免费的一般都用不了,原谅我的贫穷,没有做案例,就跟设置随机请求头一样,很简单如果你不愿意写,出钱我就帮你写,我是最廉价劳动力
4.5 处理不信任的证书
为什么要处理ssl证书:有些内容服务器没法正常打开,但是又要爬取里面的数据,比如有些禁片(别想歪啊,但是你所想的也可以爬),书,某些需要权限的网站
import requests
url = 'https://inv-veri.chinatax.gov.cn/'
res = requests.get(url,verify=False)
print(res.text)
4.6 cookies
cookie: 某个网站你登录一次下一次就不用输密码直接登录的原因
通过在客户端记录的信息确定⽤户身份,HTTP是⼀种⽆连接协议,客户端和服务器交互仅仅限于请求/响应过程,结束后 断开,下⼀次请求时,服务器会认为是⼀个新的客户端,为了维护他们之间的连接, 让服务器知道这是前⼀个⽤户发起的请求,必须在⼀个地⽅保存客户端信息。网页源代码通过浏览器渲染出界面就是我们看到的效果。
4.6.1用法
携带cookies模拟登录
知乎数据、拉勾网、掘金等网站必须登录之后才可以查看数据想要爬取里面的数据可以通过将cookies加入请求头,通过requests模拟用户登录操作而爬取数据
注意cookies有时效性过了某段时间就不能用了可能35天也可能23月这就是为什么过段时间要重新登录的原因
有些网站只有携带cookies才能访问也相当于一种反爬
4.7 session
session:通过在服务端记录的信息确定⽤户身份 这⾥这个session就是⼀个会话,保持会话
cookies和session的区别就是这样的,我讲的只是一个思维,你要多查才能加深理解
4.8 数据的提取
4.8.1非结构化的数据
想HTML他的结构复杂各种标签之间的嵌套
可以通过正则匹配、xpath提取、bs4提取来筛选数据提取想要的数据(每种提取器后面都会将,爬虫工程师必备技能都要会,必须会!)
4.8.2结构化的数据
拉勾网的数据就存储在json格式中,通过这种方式获取数据
例如json,它就相当于字典格式的字符串,只要将它转化问字典就可以根据key来取值,一般json会被双引号包裹,在internet中找到,通过下述方法提取数据
json类型的字符串 json.loads()转化为python的数据类型
python的数据类型json.dumps()转化为json的数据类型
包含json类文件对象 json.load()转化为python的数据类型
python的数据类型json.dump()转化为包含json类文件对象