爬虫requests实战演练

目录

1.获取百度网页并打印 

2.获取帅哥图片并下载到本地

3.获取美女视频并下载到本地

4.搜狗关键词搜索爬取

5.爬取百度翻译

6.爬取豆瓣电影榜单

7.JK妹子爬取


 1.获取百度网页并打印 

import requests

url="https://www.baidu.com/"
#ua伪装
param={
   ' User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36'
}

response =requests.get(url,params=param)
response.encoding = response.apparent_encoding

print(response.text)

 

其中代码中 response.encoding = response.apparent_encoding

 

encoding是从http中的header中的charset字段中提取的编码方式,若header中没有charset字段则默认为ISO-8859-1编码模式,则无法解析中文,这是乱码的原因

apparent_encoding会从网页的内容中分析网页编码的方式,所以apparent_encoding比encoding更加准确。当网页出现乱码时可以把apparent_encoding的编码格式赋值给encoding。
 

作用是  防止乱码


 

2.获取帅哥图片并下载到本地

import requests

url = "https://cn.bing.com/images/search?view=detailV2&ccid=XQzISsWk&id=979B73C4E472CCA4C34C216CD0693FDC05421E1E&thid=OIP.XQzISsWklI6N2WY4wwyZSwHaHa&mediaurl=https%3A%2F%2Ftse1-mm.cn.bing.net%2Fth%2Fid%2FR-C.5d0cc84ac5a4948e8dd96638c30c994b%3Frik%3DHh5CBdw%252fadBsIQ%26riu%3Dhttp%253a%252f%252fp2.music.126.net%252fPFVNR3tU9DCiIY71NdUDcQ%253d%253d%252f109951165334518246.jpg%26ehk%3Do08VEDcuKybQIPsOGrNpQ2glID%252fIiEV7cw%252bFo%252fzopiM%253d%26risl%3D1%26pid%3DImgRaw%26r%3D0&exph=1410&expw=1410&q=%e5%bc%a0%e6%9d%b0&simid=608020541519853506&form=IRPRST&ck=68F7B9052016D84898D3E330A6F4BC38&selectedindex=2&ajaxhist=0&ajaxserp=0&vt=0&sim=11"

r = requests.get(url)

with open("zhangjie.jpg","wb") as f:
    f.write(r.content)

print("over!!!")

结果是这个:

但是这个照片在我的window电脑上打不开

找了好久资料,这个仍然没解决,有小伙伴知道可以在评论区指点指点 

 


3.获取美女视频并下载到本地

import requests


url = 'https://haokan.baidu.com/v?pd=wisenatural&vid=12502968524882193208'
r = requests.get(url)

with open('jk.mp4', 'wb') as f:
    f.write(r.content)

print('下载完成')

 


 

4.搜狗关键词搜索爬取

import requests
#网页收集器

url = "https://www.sogou.com/web/"
kw=input('enter a word: ')
header={
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36'
}
param={
    'query':kw
}
response = requests.get(url=url,params=param,headers=header)
page_txt = response.text
filename = kw+'.html'
with open(filename,"w",encoding="utf_8") as fp:
    fp.write(page_txt)
print(filename,"保存成功")

 

 

5.爬取百度翻译

发现是post请求 (而且当你英文输入法下输入一个字母就会刷新一次页面)

import requests
import json
#获取url
post_url = "https://fanyi.baidu.com/sug"
#UA伪装
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36'
}

#数据传入
word = input("enter a word:")
data = {
    'kw': word
}
response = requests.post(url=post_url,data=data,headers=header)
dic_obj = response.json()
#print(dic_obj)

#永久性储存
filename = word+'.json'
fp = open(filename,"w",encoding="utf-8")
json.dump(dic_obj,fp=fp,ensure_ascii=False)

print("over!!!")

保存为json文件,将json文件复制

我们打开json格式网站https://www.bejson.com/

 

6.爬取豆瓣电影榜单

import requests
import json

url = "https://movie.douban.com/j/chart/top_list"
params = {
'type': '24',
'interval_id': '100:90',
'action': '',
'start': '100',
'limit': '20'
}

header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36'
}

response = requests.get(url=url,params=params,headers=header)
list_obj = response.json()

fp = open("./b.json","w",encoding="utf-8")
json.dump(list_obj,fp,ensure_ascii=False)

#最后去网页json格式网站格式化
print("over!!!")

 这里强调一下params在网站的这里

 

 

7.JK妹子爬取

import requests
import re
import urllib.request
import time
import os
header={
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36'
}
url="https://cn.bing.com/images/async?q=jk%E5%88%B6%E6%9C%8D%E5%A5%B3%E7%94%9F%E5%A4%B4%E5%83%8F&first=118&count=35&relp=35&cw=1177&ch=705&tsc=ImageBasicHover&datsrc=I&layout=RowBased&mmasync=1&SFX=4"
r = requests.get(url=url,headers=header)
c = r.text
pattern = re.compile(r'<div class="imgpt".*?<div class="img_cont hoff">.*?src="(.*?)".*?</div>',re.S)
items = re.findall(pattern,c)

os.makedirs('photo',exist_ok=True)
for a in items:
    print(a)
for a in items:
    print("下载图片:"+a)
    b=a.split('/')[-1]
    urllib.request.urlretrieve(a,'photo/'+str(int(time.time()))+'.jpg')
    print(a+'.jpg')
    time.sleep(2)

 

 

补充一:如果不使用re.S参数,则只在每一行内进行匹配,如果一行没有,就换下一行重新开始。

而使用re.S参数以后,正则表达式会将这个字符串作为一个整体,在整体中进行匹配。

补充二:os.makedirs(name, mode=0o777, exist_ok=False)
作用
用来创建多层目录(单层请用os.mkdir)
参数说明
name:你想创建的目录名
mode:要为目录设置的权限数字模式,默认的模式为 0o777 (八进制)。
exist_ok:是否在目录存在时触发异常。如果exist_ok为False(默认值),则在目标目录已存在的情况下触发FileExistsError异常;如果exist_ok为True,则在目标目录已存在的情况下不会触发FileExistsError异常。
补充三:

描述
urllib.request.urlretrieve(url, filename=None, reporthook=None, data=None)

函数说明

将URL表示的网络对象复制到本地文件。如果URL指向本地文件,则对象将不会被复制,除非提供文件名。返回一个元组()(filename,header),其中filename是可以找到对象的本地文件名,header是urlopen()返回的对象的info()方法(用于远程对象)。
第二个参数(如果存在)指定要复制到的文件位置(如果没有,该位置将是一个生成名称的tempfile)。第三个参数,如果存在,则是一个回调函数,它将在建立网络连接时调用一次,并且在此后每个块读取后调用一次。这个回调函数将传递三个参数;到目前为止传输的块计数,以字节为单位的块大小,以及文件的总大小。第三个参数可能是-1,在旧的FTP服务器上,它不返回文件大小以响应检索请求。

参数说明

url:外部或者本地url
filename:指定了保存到本地的路径(如果未指定该参数,urllib会生成一个临时文件来保存数据);

reporthook:是一个回调函数,当连接上服务器、以及相应的数据块传输完毕的时候会触发该回调。我们可以利用这个回调函数来显示当前的下载进度。

data:指post到服务器的数据。该方法返回一个包含两个元素的元组(filename, headers),filename表示保存到本地的路径,header表示服务器的响应头。
 

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

heart_6662

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值