Python爬虫、数据清洗与可视化-2 -requests

一、认识网页结构

网页一般由三部分组成,分别是:

  1. HTML(超文本标记语言);
  2. CSS(层叠样式表);
  3. JScript(活动脚本语言)。

1.HTML
HTML 是整个网页的结构,相当于整个网站的框架。带“<”、“>”符号的都是属于 HTML 的标签,并且标签都是成对出现的。
常见的标签如下:

.. 表示标记中间的元素是网页 .. 表示用户可见的内容
..
表示框架

..

表示段落
  • ..
  • 表示列表 ..表示图片

    ..

    表示标题 ..表示超链接

CSS
CSS 表示样式,图 1 中第 13 行<style type="text/css">表示下面引用一个 CSS,在 CSS 中定义了外观。

JScript
JScript 表示功能。交互的内容和各种特效都在 JScript 中,JScript 描述了网站中的各种功能。

如果用人体来比喻,HTML 是人的骨架,并且定义了人的嘴巴、眼睛、耳朵等要长在哪里。CSS 是人的外观细节,如嘴巴长什么样子,眼睛是双眼皮还是单眼皮,是大眼睛还是小眼睛,皮肤是黑色的还是白色的等。JScript 表示人的技能,例如跳舞、唱歌或者演奏乐器等。

二、使用 requests 库请求网站

网页请求的过程分为两个环节:
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('我爱中国')

三、BeautifulSoup解析

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的方法

使用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)

你可能感兴趣的:(python爬虫学习,python)