欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

2021/4/19爬虫第三次课(爬虫网络请求模块)

程序员文章站 2022-05-02 22:13:23
...

一、状态码和抓包工具

  • 301 永久重定向
  • 302 临时重定向
  • requests
  • urllib.request

二、requests模块(引入)

import requests
url='https://img1.baidu.com/it/u=1110563168,1750140428&fm=26&fmt=auto&gp=0.jpg'response = requests.get(url)
fn = open('code.png','wb')
fn.write(response.content)
fn.close()

url = 'https://dss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=3566088443,3713209594&fm=26&gp=0.jpg'
response = requests.get(url)
fn = open('code.png','wb')
with open('code2.png','wb') as file_obj:
    file_obj.write(response.content)

from urllib import request

url = 'https://dss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=3566088443,3713209594&fm=26&gp=0.jpg'
request.urlretrieve(url,'code3.png')

以上用了两种保存方式

三、urllib简介

3.1什么是urllib模块

Python 内置的网络请求模块

3.2为什么要学习这个模块?

1 有些比较老的爬虫项目用的就是这个技术
2 有的时候我们去爬取一些数据需要requests + urllib模块进行配合
3 内置的

四、urllib.request使用

模板

# 1 创建请求对象
req = urllib.request.Request(url,headers=headers)
# 2 发出请求并获取响应对象
response = urllib.request.urlopen(req)
# 3 读取 响应对象的内容
html = response.read().decode('utf-8')
print(html)

五、urllib.parse使用

通过urllib向一个携带有中文字眼的url发起请求,这个时候需要注意要把中文转换成百分号+十六进制的这种数据类型 即这时候要用urllib.parse
import urllib.parse
#1
wd = {'wd':'海贼王'}
result = urllib.parse.urlencode(wd)
print(result)
base_url = 'https://www.baidu.com/s?' + result
print(base_url)

#2
r = '海贼王'
result = urllib.parse.quote(r)
# print(result)
url3 = 'https://www.baidu.com/s?wd=' + result
print(url3)

六、案例

爬取百度贴吧指定页面的html

import urllib.request
import urllib.parse
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.128 Safari/537.36'
}

name = input('请输入贴吧名:')
begin = int(input('请输入起始页:'))
end = int(input('请输入结束页:'))

kw = {'kw':name}
result = urllib.parse.urlencode(kw)

# 拼接url 创建请求对象 发请求获取响应 读取 保存数据
# https://tieba.baidu.com/f?kw=%E6%B5%B7%E8%B4%BC%E7%8E%8B&pn=0
for i in range(begin,end+1):
    pn = (i - 1) * 50
    # print(pn)
    base_url = 'https://tieba.baidu.com/f?'
    url = base_url + result + '&pn=' + str(pn)
    # 发请求获响应
    req = urllib.request.Request(url,headers=headers)
    res = urllib.request.urlopen(req)
    html = res.read().decode('utf-8')
    # 写入文件
    filename = '第' + str(i) + '页.html'
    with open(filename,'w',encoding='utf-8') as file_obj:
        print('正在爬取%d页'%i)
        file_obj.write(html)

# 改写成 函数式编程 改写成面向对象的编程方式

七、补充

pycharm使用技巧----structure用法

import urllib.parse
hero_url = 'http%3A%2F%2Fshp%2Eqpic%2Ecn%2Fishow%2F2735041519%2F1618485629%5F84828260%5F22420%5FsProdImgNo%5F1%2Ejpg%2F200' # 图片的url
img_url = urllib.parse.unquote(hero_url)
print(img_url)

字节流 = response.read()
响应对象
• read() 读取服务器响应的内容
• getcode() 返回HTTP的响应码
• geturl() 返回实际数据的URL(防止重定向问题)

encode str(字符串) --> bytes数据类型
decode bytes数据类型 --> str(字符串)