网页一般由三部分组成,分别是:
1.HTML
HTML 是整个网页的结构,相当于整个网站的框架。带“<”、“>”符号的都是属于 HTML 的标签,并且标签都是成对出现的。
常见的标签如下:
.. 表示标记中间的元素是网页 .. 表示用户可见的内容..表示框架..
表示段落
- ..
- 表示列表 ..表示图片
..
表示标题 ..表示超链接
CSS
CSS 表示样式,图 1 中第 13 行<style type="text/css">表示下面引用一个 CSS,在 CSS 中定义了外观。
JScript
JScript 表示功能。交互的内容和各种特效都在 JScript 中,JScript 描述了网站中的各种功能。
如果用人体来比喻,HTML 是人的骨架,并且定义了人的嘴巴、眼睛、耳朵等要长在哪里。CSS 是人的外观细节,如嘴巴长什么样子,眼睛是双眼皮还是单眼皮,是大眼睛还是小眼睛,皮肤是黑色的还是白色的等。JScript 表示人的技能,例如跳舞、唱歌或者演奏乐器等。
网页请求的过程分为两个环节:
1.Request (请求):向服务器发送访问请求。
2.Response(响应):向用户(客户端)发送响应的内容。
网页请求的方式也分为两种:
1.GET:最常见的方式,一般用于获取或者查询资源信息,也是大多数网站使用的方式,响应速度快。
2.POST:相比 GET 方式,多了以表单形式上传参数的功能,因此除查询信息外,还可以修改信息。
1.get方式
import requests #导入requests包
url = 'http://www.cntour.cn/'#定义URL
strhtml = requests.get(url) #Get方式获取网页数据
print(strhtml.text)# 打印响应内容
res.encoding = res.apparent_encoding#指定编码如,res.encoding='gb2312'
print(res) # 200代表状态码
# print(res.text) # 返回响应文本,str字符串类型
# print(res.encoding) # requests库认为的编码方式 ISO-8859-1
# print(res.content) # 返回响应源码,bytes类型
# print(res.content.decode('utf-8')) # 把响应的bytes源码转为str类型
# print(res.status_code) # 当前请求的响应码
# print(res.request.headers) # 查看请求的请求头
# print(res.headers) # 查看响应头
# print(res.request.cookies) # 查看请求的cookie
# print(res.cookies) # 查看响应的cookies
注意: 如果response.text有乱码解决办法:
response.content.decode()
response.content.decode(‘gbk’)
response.content.decode(‘unicode_escape’)
response = requests.get(url,timeout=3)# 请求如果在规定时间之内(3秒钟内)没有得到响应,就会抛出超时错误
response.text返回的类型是str
response.content返回的类型是bytes,可以通过decode()方法将bytes类型转为str类型
推荐使用:response.content.decode()的方式获取相应的html页面
response.text
解码类型:根据HTTP头部对响应的编码做出有根据的推测,推测的文本编码
如何修改编码方式:response.encoding = ‘gbk’
response.content
解码类型:没有指定
如何修改编码方式:response.content.decode(‘utf8’)
2.post
import requests #导入requests包
import json
def get_translate_date(word=None):
url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
From_data={
'i':word,'from':'zh-CHS','to':'en','smartresult':'dict','client':'fanyideskweb','salt':'15477056211258','sign':'b3589f32c38bc9e3876a570b8a992604','ts':'1547705621125','bv':'b33a2f3f9d09bde064c9275bcb33d94e','doctype':'json','version':'2.1','keyfrom':'fanyi.web','action':'FY_BY_REALTIME','typoResult':'false'}
#请求表单数据
response = requests.post(url,data=From_data)
#将Json格式字符串转字典
content = json.loads(response.text)
print(content)
#打印翻译后的数据
#print(content['translateResult'][0][0]['tgt'])
if __name__=='__main__':
get_translate_date('我爱中国')
from bs4 import BeautifulSoup
soup=BeautifulSoup(strhtml.text,'lxml')
data = soup.select('#main>div>div.mtop.firstMod.clearfix>div.centerBox>ul.newsList>li>a')
print(data)
for item in data:
result={
'title':item.get_text(),
'link':item.get('href')
}
print(result)
1.在 Request headers 中构造浏览器的请求头,封装自己。
headers={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'}
response = request.get(url,headers=headers)
2.增设延时
2-1.设置 3 秒钟抓取一次
import time
time.sleep(3)
2-2.在数据采集时经常使用代理。
首先,构建自己的代理 IP 池,将其以字典的形式赋值给 proxies,然后传输给 requests,
proxies={
"http":"http://10.10.1.10:3128",
"https":"http://10.10.1.10:1080",
}
response = requests.get(url, proxies=proxies)
代理IP的分类
根据代理ip的匿名程度,代理IP主要可以分为下面三类:
1.透明代理(Transparent Proxy):透明代理虽然可以直接“隐藏”你的IP地址,但是还是可以查到你是谁。
2.匿名代理(Anonymous Proxy):使用匿名代理,别人只能知道你用了代理,无法知道你是谁。
3.高匿代理(Elite proxy或High Anonymity Proxy):高匿代理让别人根本无法发现你是在用代理,所以是最好的选择。
来这里分享几个代理获取的好地方;
http://ip.kxdaili.com/ 开心代理
https://proxy.mimvp.com/free.php 米扑代理
http://www.xiladaili.com/ 西拉免费代理IP
http://ip.jiangxianli.com/ 免费代理IP库
http://www.superfastip.com/ 极速代理
https://proxy.mimvp.com/free.php 米扑代理
http://www.shenjidaili.com/open/ 神鸡代理IP
http://31f.cn/http-proxy/ 三一代理
http://www.feiyiproxy.com/?page_id=1457 飞蚁代理
http://ip.zdaye.com/dayProxy/2019/4/1.html 站大爷
http://www.66ip.cn 66免费代理网
https://www.kuaidaili.com/free/inha 快代理
https://www.xicidaili.com 西刺
http://www.ip3366.net/free/?stype=1 云代理
http://www.iphai.com/free/ng IP海
http://www.goubanjia.com/ 全网代理
http://www.89ip.cn/index.html 89免费代理
http://www.qydaili.com/free/?action=china&page=3 旗云代理
proxy = {
'http': "125.108.108.165:9000"
}
response = requests.get(url, proxies=proxy)
使用requests处理cookie有三种方法:
1.cookie字符串放在headers中
import requests
url = "http://www.renren.com/972035912/newsfeed/photo"
headers = {
"cookie的name":"cookie的value"
}# 使用cookie来实现模拟登陆, 在请求头中定义登陆后的cookie,代入到请求中
response = requests.get(url, headers=headers)
print(response.text)
2.把cookie字典放传给请求方法的cookies参数接收
cookie_dict = {
"cookie的name":"cookie的value"} # 登陆后的cookies,同上
requests.get(url,headers=headers,cookies=cookie_dict}
3.使用requests提供的session模块
import requests
url = "http://www.renren.com/PLogin.do"
data = {
"email": "xxxxx",
"password": "xxxxx"
}# 构造formdata,填写自己的账号和密码
session = requests.Session()# session的使用: 在请求之前创建session对象
session.post(url, data=data)# 后续的请求都由session来发起,因为session中保存了用户的登陆信息
response = session.get("http://www.renren.com/972035912/newsfeed/photo")# 使用session请求登陆后的界面
print(response.text)