手把手教你爬虫requests实战演练

发布时间:2022-07-02 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了手把手教你爬虫requests实战演练脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

一、前言

前面两篇文章我已经把requests基础与高阶篇都做了详细讲解,也有不少了例子。那么本篇在基于前两篇文章之上,专门做一篇实战篇。 环境F1a;jupyter 如果你不会使用jupyter请看我这一篇文章:jupyter安装教程与使用教程

二、实战

1)获取百度网页并打印

#-*- coding: utf-8 -*
import requests


url = 'http://www.baidu.COM'

r = requests.get(url)
r.encoding = r.apparent_encoding

PRint(r.text)

运行:

手把手教你爬虫requests实战演练

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

手把手教你爬虫requests实战演练

比如我们得到链接:张杰图片链接

我现在想把这张图片下载下来:

import requests


src = '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(src)

wITh oPEn('bizhi.jpg', 'wb') as f:
    f.write(r.content)

print('下载完成') 

运行:

手把手教你爬虫requests实战演练

4) 获取美女视频并下载到本地

比如我得到一个视频链接为:jk美女摇摆摇摆 代码:

import requests


src = 'https://apd-36ae3724d7c0b6835e09d09afc998CFa.v.smtcdns.com/om.tc.QQ.com/Amu-xLH92Fdz3C-7PsjutQi_lMKUzCnkiicBjZ69cAqk/uwMROfz2r55oIaQXGdGnC2dePkfe0TtOFg8QaGVhJ2MPCPEj/svp_50001/szg_9711_50001_0bf26aabmaaaqyaarhnfdnqfd4gdc3yaafsa.f632.mp4?sdtFrom=v1010&guid=442bebcff8ab31b452c4a64140cd7f3a&vkey=762D67379522C89E3A76A0759F02B2905311E3FE385B3EC351571A1F2D5A0A6A58D5744F68F9C668211191507472C84F4D2B7D147B7F1BB833B04D6E0CC3945CA361CF9E63E01C277F08CD3D69B288562D33EB7EB83861585CB549B2D4EE38E50CA732275EE0B5ECD680378B2DBEBB0DBEE5B100998B1A83694140CF8588CABD91EB22B4369D5940'

r = requests.get(src)

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

print('下载完成')

运行:(下载成功,自行点开视频查看,不演示)

手把手教你爬虫requests实战演练

5)搜狗关键词搜索爬取

手把手教你爬虫requests实战演练

代码:

import requests
#指定url
url='https://www.sogou.com/web'
kw=input('enter a word: ')
header={
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) Applewebkit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36'
}
param={
    'query':kw
}
#发起请求,做好伪装
response=requests.get(url=url,params=param,headers=header)
#获取相应数据
content=response.text
fileName=kw+'.html'
#将数据保存在本地
with open(fileName,'w',encoding='utf-8') as fp:
    fp.write(content)
print(fileName,'爬取完成!!!')

运行输入:张杰,回车

手把手教你爬虫requests实战演练

点开下载好的html如下:

手把手教你爬虫requests实战演练

6)爬取百度翻译

分析找到接口:

手把手教你爬虫requests实战演练

点开:

手把手教你爬虫requests实战演练

由此我们可以拿到接口和请求方式:

手把手教你爬虫requests实战演练

代码为:

import json
import requests
url='https://fanyi.baidu.com/sug'
word=input('请输入想翻译的词语或句子:')
data={
    'kw':word
}
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2626.106 Safari/537.36'
}
reponse=requests.post(url=url,data=data,headers=headers)
dic_obj=reponse.json()
# print(dic_obj)
filename=word+'.json'
with open(filename,'w',encoding='utf-8') as fp:
    json.dump(dic_obj,fp=fp,ensure_ascii=False)
j=dic_obj['data'][1]['v']
print(j)

测试一:

手把手教你爬虫requests实战演练

测试二:

手把手教你爬虫requests实战演练

7)爬取豆瓣电影榜单

目标网址:

https://movie.douban.com/chart

代码:

import json
import requests
url='https://movie.douban.com/j/chart/top_list?'
params={
    'type': '11',
    'interval_id': '100:90',
    'action': '',
    'start': '0',
    'limit': '20',
}
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2626.106 Safari/537.36'
}
reponse=requests.get(url=url,params=params,headers=headers)
dic_obj=reponse.json()
print(dic_obj)
with open('douban.json','w',encoding='utf-8') as fp:
    json.dump(dic_obj,fp=fp,ensure_ascii=False)

运行:(同时保存为json)

手把手教你爬虫requests实战演练

8) 美女私房照爬取

第一部分:定义要爬取的标签和正在爬取的页数

def UserUrl(theme,pagenum):
    url = "https://tuchong.com/rest/tags/%(theme)s/posts?page=%(pagenum)s&count=20&order=weekly" % {'theme': urllib.parse.quote(theme), 'pagenum': pagenum}
    #print(url)
    return url

第二部分:止反扒

def GetHtmltext(url):
    head = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36"
    }
    try:
        r = requests.get(url, headers=head, timeout=30)
        r.raise_for_status()  #如果返回的状态码不是200,就到except中
        return r
    except:
        pass

第三部分:定义获取一个pagenum页面中的所有图集的URL链接的函数

def PictureFatherUrl(user_url):
    try:
        raw_data = GetHtmltext(user_url)
        j_raw_data = json.loads(raw_data.text)   #将获取的网页转化为Python数据结构
        # print(j_raw_data)
        father_url = []                    #将每个图集的url定义为father_url的一个列表
        for i in j_raw_data['postList']:   #解析出的j_raw_data是一个多重字典,在这里先将postList字典的内容取出来
            father_url.append(i['url'])     #然后再取出键为“url”的值
        return father_url
    except:
        return

第四部分:定义获取一个图集中所有图片的url链接

def PictureUrl(url):
    try:
        html = GetHtmltext(url)
        #利用正则表达式来匹配
        url_list = list(re.findall('<img id="imaged+" class="multi-photo-image" src="([a-zA-z]+://[^s]*)" alt="">', html.text))
        return url_list
    except:

第五部分:

#定义一个图集中所有图片的下载
def Download(url):
    url_list = PictureUrl(url)
    for i in url_list:
        r = GetHtmltext(i)
        file_name = os.path.join(save_path, i.split('/')[-1])
        with open(file_name, 'wb') as f:
            f.write(r.content)
            f.close()
        time.sleep(random.uniform(0.3, 0.5))  #为防止被反爬,在这里random了0.3-0.5的数,然后在下载一张图片后,sleep一下
        print('下载成功保存至 %s' % file_name)

主函数:

if __name__ == '__main__':
    theme = input("你选择的标签(如果你不知道有什么标签,去https://tuchong.com/explore/去看看有什么标签吧,输入不存在的标签无法下载哦):")
    pagenum_all = int(input("你要爬取的页数(不要太贪心哦,数字太大会被封IP的):"))
    save_path = os.path.join(theme)
    m = 0
    if not os.path.exists(save_path):
        os.makedirs(save_path)
        print("我知道你没有创建保存路径,我把文件存在和此脚本同样的路径下的叫做“ %s ”的文件夹下面了" % theme)
    for i in range(1, pagenum_all+1):
        n = 0
        m += 1
        print("正在下载第%d页,一共%d页" % (m, pagenum_all))
        user_url = UserUrl(theme, i)
        father_url = PictureFatherUrl(user_url)
        for j in father_url:
            n += 1
            print("正在下载第%d套图,一共%d套图" % (n, len(father_url)))
            Download(j)
            time.sleep(random.randint(6, 10))  #同样为了反爬,也random了6-10之间的数,更真实的模拟人的操作

完整代码:

#coding=gbk
"""
作者:川川
时间:2021/10/11
"""

import os
import re
import json
import requests
import time
import urllib.parse
import random


#定义要爬取的标签和正在爬取的页数
def UserUrl(theme,pagenum):
    url = "https://tuchong.com/rest/tags/%(theme)s/posts?page=%(pagenum)s&count=20&order=weekly" % {'theme': urllib.parse.quote(theme), 'pagenum': pagenum}
    #print(url)
    return url

#利用requests使用get方法请求url,使用User-Agent是为了防止被反爬,这样使得我们的爬取行为更像人的行为
def GetHtmltext(url):
    head = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36"
    }
    try:
        r = requests.get(url, headers=head, timeout=30)
        r.raise_for_status()  #如果返回的状态码不是200,就到except中
        return r
    except:
        pass

#定义获取一个pagenum页面中的所有图集的URL链接的函数
def PictureFatherUrl(user_url):
    try:
        raw_data = GetHtmltext(user_url)
        j_raw_data = json.loads(raw_data.text)   #将获取的网页转化为Python数据结构
        # print(j_raw_data)
        father_url = []                    #将每个图集的url定义为father_url的一个列表
        for i in j_raw_data['postList']:   #解析出的j_raw_data是一个多重字典,在这里先将postList字典的内容取出来
            father_url.append(i['url'])     #然后再取出键为“url”的值
        return father_url
    except:
        return

#定义获取一个图集中所有图片的url链接
def PictureUrl(url):
    try:
        html = GetHtmltext(url)
        #利用正则表达式来匹配
        url_list = list(re.findall('<img id="imaged+" class="multi-photo-image" src="([a-zA-z]+://[^s]*)" alt="">', html.text))
        return url_list
    except:
        pass

#定义一个图集中所有图片的下载
def Download(url):
    url_list = PictureUrl(url)
    for i in url_list:
        r = GetHtmltext(i)
        file_name = os.path.join(save_path, i.split('/')[-1])
        with open(file_name, 'wb') as f:
            f.write(r.content)
            f.close()
        time.sleep(random.uniform(0.3, 0.5))  #为防止被反爬,在这里random了0.3-0.5的数,然后在下载一张图片后,sleep一下
        print('下载成功保存至 %s' % file_name)

#定义主函数
if __name__ == '__main__':
    theme = input("你选择的标签(如果你不知道有什么标签,去https://tuchong.com/explore/去看看有什么标签吧,输入不存在的标签无法下载哦):")
    pagenum_all = int(input("你要爬取的页数(不要太贪心哦,数字太大会被封IP的):"))
    save_path = os.path.join(theme)
    m = 0
    if not os.path.exists(save_path):
        os.makedirs(save_path)
        print("我知道你没有创建保存路径,我把文件存在和此脚本同样的路径下的叫做“ %s ”的文件夹下面了" % theme)
    for i in range(1, pagenum_all+1):
        n = 0
        m += 1
        print("正在下载第%d页,一共%d页" % (m, pagenum_all))
        user_url = UserUrl(theme, i)
        father_url = PictureFatherUrl(user_url)
        for j in father_url:
            n += 1
            print("正在下载第%d套图,一共%d套图" % (n, len(father_url)))
            Download(j)
            time.sleep(random.randint(6, 10))  #同样为了反爬,也random了6-10之间的数,更真实的模拟人的操作

运行:按照提示输入回车

手把手教你爬虫requests实战演练

手把手教你爬虫requests实战演练

手把手教你爬虫requests实战演练

当然,难道我的心只有小姐姐私房照?NONONO!你只要输入该网任意一个标签的都可给下载下来,比如模特?你可以测试一下。

手把手教你爬虫requests实战演练

三、1024程序员节的我

我从上海来到长沙,除了之外,更是有幸认识了很多大佬,程序员并不秃头,我们依然头发茂盛!发几张我在这里的部分合影。

1-跟CSDN总裁与一些大佬的合影

手把手教你爬虫requests实战演练

1-跟CSDN副总裁与一些大佬的合影:

手把手教你爬虫requests实战演练

吃的就不发了吧hhhhh很有有幸见到大家。

四、总结

由于单纯的requests做爬取我仅仅也只能找到这一些例子进行演示爬取了,希望你认真从我的文章中领悟爬虫的快乐。本篇结尾,requests就已经写完,后续我会上更多的教程来丰富爬虫,不用担心你学不好,有问题粉丝群找我。 如果本篇内容你没有看懂,那么你一定在基础环节出现了问题,我写的每一篇内容都是不断向前进阶,我不会一直停留基础文,如果你基础不扎实,那么推荐你看我专栏:python全栈基础专栏 如果你是requests基础知识不熟悉,请看我专栏两篇关于requests的教程:爬虫从入门到精通教程系列 写文不容易,大家三连支持我一下好不好,拜托了!

脚本宝典总结

以上是脚本宝典为你收集整理的手把手教你爬虫requests实战演练全部内容,希望文章能够帮你解决手把手教你爬虫requests实战演练所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。