python进阶一(简易爬虫一)

一、爬虫的基本知识:

1、爬虫的理解:

         (1)网络爬虫,即Web Spider,网络蜘蛛是通过网页的链接地址来寻找网页的。

2、爬虫的设计过程:

         根据网页的三大特征(框架、样式、行为), 发送请求获取数据,筛选数据保存,数据有url地址,继续(发送请求获取数                       据)。 

3、爬虫的分类:

        通用爬虫:目标、流程(爬取网页 - 存储数据 - 内容处理 - 提供检索/排名服务)、遵循Robots协议。

         聚焦爬虫:与通用搜索引擎爬虫的区别在于: 聚焦爬虫在实施网页抓取时会对内容进行处理筛选,                尽量保证只抓取与需求相关的网页信息。

二、发送请求获取数据(requests包):

                         requests.get(url,params=None,**kwargs) 、reguests.post(url,date=None,json=None,**kwargs)

          帮助发送请求,这个作为入门的工具还是不错的,对了解一些爬虫的基本理念,掌握爬虫爬取的流程有所帮助。

1、requests安装:

                cmd安装:

                

          anacanda安装:

                

2、基本请求get/post:

                      注意:(1)url是必须的参数,http协议必须要写。

                                 (2). text  得到的是 str 类型。

import requests
url2 = 'http://httpbin.org/get'
url3 = 'http://httpbin.org/post'
r = requests.get(url2)
print(r.text)

print(type(r.text))                       <class 'str'>   .text是字符串类型。

r1 = requests.post(url2)
print(r1.text)
import requests
url2 = 'http://www.ibeifeng.com'
#
r = requests.get(url2)
print(r)     # <Response [200]>   得到响应对象, 200表示成功
print(type(r))      #   <class 'requests.models.Response'>  查看返回类型
print(r.status_code)      # 查看响应码    200
#1. 正在请求
#2. 请求成功
#3. 重定向
#4. 客户端有问题
#5. 服务器的问题
print(r.encoding)          # gbk 查看编码方式
print(r.cookies)
print(r.text)   #编码是gbk没有乱码,以字符串形式显示,如果是json文件,需要loads后才可以使用字典。

                 .text 乱码时的处理方法。
url3 = 'https://www.woyaogexing.com/'
r2 = requests.get(url3)
print(r2.text)         #乱码。
print(r2.content.decode('utf-8'))   # 以字节形式展示并用utf-8解码得到正常结果。

3、基本请求get传递参数:

                         get传递参数用 params ,post 传递参数用 data

import requests
url = 'http://httpbin.org/get'
pay = {'name':'yangmi','age':'30'}            # 用字典的格式。相当于将两个键值对传到args对应的value中。
r = requests.get(url,params=pay)      # 传递参数
print(r.text)
print(r.url)             #结果:  http://httpbin.org/get?name=yangmi&age=30 

                                                        

4、基本请求get伪装浏览器:

import requests
url = 'https://www.zhihu.com'
r = requests.get(url)
print(r.text)                   # 被阻拦

dict1 = {
    'name':'zhangsan',
    'age':'20'
}
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'
}         # get 访问添加头文件仿照 浏览器。
r1 = requests.get(url,params=dict1,headers=headers)       # params 添加参数,headers 设置头文件。
print(r1.text)        # 访问成功
print(r1.url)      # 结果:https://www.zhihu.com/signup?next=%2F%3Fname%3Dzhangsan%26age%3D20

5、get请求解析json数据(附加模块json的用法):

import json
 
data = {
    'name' : 'ACME',
    'shares' : 100,
    'price' : 542.23
}
 
json_str = json.dumps(data)   将python字典对象转化为json字符串。



data = json.loads(json_str)  将json字符串转化为python字典对象

方法一:

import requests
url = 'https://github.com/time.json'
r = requests.get(url)
print(r.text)
print(r.text['message'])           # 报错
print(r.json())             # requests 内部有一个json解码器,可以将 json 字符串格式转化为 python的对象。
print(r.json()['message'])  # 可以获取字典的values

方法二:

利用插入json模块的方法:

import requests
import json           # 插入json模块
url = 'https://github.com/time.json'
r = requests.get(url)
dict1 = json.loads(r)        # 错误,因为 r 是响应对象,而不是json字符串。
dict2 = json.loads(r.text)   # 将json字符串转化为python字典对象。
print(dict2['message'])

6、利用get下载 音频、图片:

                     爬取图片
import requests
url = 'http://wx4.sinaimg.cn/large/67b2eab9ly1flwuchb5vlj20dw0dwdi1.jpg'
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'
}
text = requests.get(url,headers=headers,stream=True)
with open('1.jpg','wb') as file:
    for i in text.iter_content(1024):
        file.write(i)
                    爬取音频
import requests
url = 'https://m10.music.126.net/20181112201426/6a0a71e1afe74bf40d48a2598c4cead9/ymusic/3020/0523/bdb1/9b15432eb04a5b4ba66c64409da4b27d.mp3'
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'
}
text = requests.get(url,headers=headers,stream=True)
with open('1.mp3','wb') as file:
    for i in text.iter_content(1024):
        file.write(i)

7、获取网页的cookie:

                   获取 cookie
import requests
url= 'http://www.ibeifeng.com'
a = requests.get(url)
print(a.cookies)

                    向网站发送cookie
import requests
url= 'http://httpbin.org/get'
a = requests.get(url)
print(a.text)
                  第一种
a1 = requests.get(url,cookies={'name':'yangmi'})
print(a1.text)
                   第二种 cookies可以放在hearders中。
a1 = requests.get(url,cookies={'name':'yangmi'})
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
    'cookies':"{'name':'yangmi'}"     # 注意,headers是 str 类型,因此 {'name':'yangmi'} 要加 “”。
}
print(a1.text)

三、post请求:

1、post请求添加参数(data =):

                            post访问添加参数为data,get是params

                  

2、post请求发送cookie(cookies =):

                             

3、post请求,发送文件(files =)到服务器中:

with open('post_111.txt','wb') as file:
    pass
import requests
url= 'http://httpbin.org/post'
files = {'file': open('post_111.txt','rb')}
a = requests.post(url,files=files)
print(a.text)

                                                    

4、post请求,发送json数据:

                                       

5、请求超时与异常处理:

(1)超时设定timeout:

                    你可以告诉 requests 在经过以 timeout 参数设定的秒数时间之后停止等待响应。基本上所有的生产代码都应该使用                      这一参数。如果不使用,你的程序可能会永远失去响应:                     

r = requests.get('http://github.com', timeout=0.1) # 超时设置
print(r.text)

(2)异常处理:

                 异常处理:
list1=[1,5]
list1[3] = 10
try:
    print(list2)
    print(list1)                
except IndexError as e:          # 索引错误 跳过
    print(e)
except NameError as e:    # 变量未定义错误 跳过
    print(e)
except BaseException as e:    # try代码块错误跳过。
    print(e)

print('a')
print('a')
print('a')

猜你喜欢

转载自blog.csdn.net/qq_16555103/article/details/83990404