浅谈爬虫——基于python的requests模块

前言:

今天我们来学习一下可爱的小爬虫


配置环境:

首先我们下载好pycharm,打开Terminal,

利用命令:pip install requests

这样就配置好了requests模块。


简单爬取直接资源:

打开一个网页,看见了一个好看的图片,但是不知道咋回事发现不能下载,那么怎么把它搞到呢?

首先请使用火狐,谷歌这种浏览器,利用浏览器的审查元素功能查看网页,不断调整鼠标指向,就可以找到某个网页元素的图片。

这里用图片为例,但其实可以用来爬取音乐之类的,一般图片可以直接保存的。

接下来是代码:

import requests
url="https://马赛克/4f7147c9ae0fe44a7462d2b94a5ec398.jpg_biwbp"   #用资源的连接赋值给变量url

with open('pic.jpg', 'wb') as f:     #利用with创造文件(会自动关闭),二进制方式写入
    con = requests.get(url)        #模拟浏览器发送请求
    f.write(con.content)     #向文件写入内容

当当!来了~

如果没有爬到,不要急,可以加个UA头试试

UA头:user-agent,就是http头中的一个部分,表明请求发起者的身份,我们通过改变user-agent来模拟浏览器访问

查找UA头:在审查元素中,network,刷新页面,点击一个页面资源,即可找到UA信息

带有UA的代码:

import requests
url="https://马赛克/4f7147c9ae0fe44a7462d2b94a5ec398.jpg_biwbp"   #用资源的连接赋值给变量url
header={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36"}   #改变UA头,避免一些反爬虫措施

with open('pic.jpg', 'wb') as f:     #利用with创造文件(会自动关闭),二进制方式写入
    con = requests.get(url,header)        #模拟浏览器发送请求
    f.write(con.content)     #向文件写入内容

 


利用正则表达式高效率爬取信息:

找到我们想要爬取的网页,发送请求,得到返回值后查看text内容

import requests
import re

url="https://www.马赛克.com/tag/weimeinvsheng.html"   #用资源的连接赋值给变量url
header={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36"} #改变UA头,避免一些反爬虫措施 html=requests.get(url,header) print(html.text)

即可看到该网页源代码被打印

注意:如果出现乱码情况,是编码方式的原因,可以改变编码来解决

html.encoding="utf-8"

编码方式可以通过源代码中的“charset”来查看(一般在head标签中)

我们可以利用浏览器的审查元素发现,这个蓝色的url就是某个图片,那我们把这几个url筛出来,做成一个列表,循环请求访问,即可把所有图片都保存到本地。

筛出这些url,就要靠我们的正则表达式(re模块)。

点击这里来了解正则表达式?

import requests
import re

#用资源的连接赋值给变量url
url="https://www.马赛克.com/tag/weimeinvsheng.html"   
#改变UA头,避免一些反爬虫措施
header={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36"}   

#发送请求
html=requests.get(url,headers=header) html=html.text #查询条件 res=re.compile(r'<img data-original="(.*?)"') #筛选查询(匹配所有) reg=re.findall(res,html) print(reg)

然后我们就得到了一个url列表:

为了方便规整,将刚才的代码做成一个方法:

def request():
    url = "https://www.马赛克.com/tag/weimeinvsheng.html"  # 用资源的连接赋值给变量url
    header = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36"}  # 改变UA头,避免一些反爬虫措施

    # 发送请求
    html = requests.get(url, headers=header) html = html.text # 查询条件 res = re.compile(r'<img data-original="(.*?)"') # 筛选查询(匹配所有) reg = re.findall(res, html) print(reg)

再做一个方法,作用是去通过url,下载内容,保存到本地

def download(url,name):
    header = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36"
    }
    #发送请求(第三个参数是一个超时设置,可加可不加)
    html = requests.get(url,headers=header,timeout=3)
    #打开文件,进行操作
    with open(name+'.jpg','wb') as f:
        f.write(html.content)

再做一个方法,就是通过循环访问一个列表的元素,调用刚才的方法download:

def cycle(list):
    i=0
    for id in list:
        i=i+1
        download(id,i)

修改方法request方法,调用cycle:

将最后一句

    print(reg)

 

改为

    cycle(reg)

好,现在我们来看一下完整代码:

import requests
import re

def request():
    url = "https://www.马赛克.com/tag/weimeinvsheng.html"  # 用资源的连接赋值给变量url

    # 改变UA头,避免一些反爬虫措施
    header = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36"
    }

    # 发送请求
    html = requests.get(url, headers=header)
    html = html.text
    # 查询条件(r' ' 加r使字符串中\不具有转义功能)
    res = re.compile(r'<img data-original="(.*?)"')
    # 筛选查询(匹配所有)
    reg = re.findall(res, html)
    cycle(reg)
def download(url,name):
    header = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36"
    }
    #发送请求(第三个参数是一个超时设置,可加可不加)
    html = requests.get(url,headers=header,timeout=3)
    #打开文件,进行操作
    with open(str(name)+'.jpg','wb') as f:
        f.write(html.content)
def cycle(list):
    i=0
    for id in list:
        i=i+1
        download(id,i)


request()

运行一下,就会发现大功告成了!

 


额外技巧:

让爬虫走代理:

    proxy = "127.0.0.1:1080"
    proxies = {
        "http": "http://" + proxy,
        "https": "https://" + proxy,
    }
    #发送请求(第三个参数是一个超时设置,可加可不加)
    html = requests.get(url,proxies=proxies)

设置休息时间

# 睡眠 1 秒 
time.sleep(1);

 

 

 

 

 

 

 

 

商业转载 请联系作者获得授权,非商业转载 请标明出处

 

 

 

 

发表评论