一, U-A伪装

接着上一篇:躲在被窝里偷偷学爬虫—概论及初始来处理被某度反爬打脸开始!

汽车之家是没有任何反爬虫措施的,但某度有,如果还是按照爬汽车之家的老套路,就会反而被某度所安排!按f12进入开发者工具,仔细观察一下
在这里插入图片描述
再滑到Headers最下面
在这里插入图片描述
那么将上图中的User-Agent拿到代码中,看看能不能解决问题

# !/usr/bin/env python
# -*- coding:utf-8 -*-
# @Author:HePengLi
# @Time:2021-03-22

import requests


# 某度的url地址
url = 'https://www.baidu.com/s?wd=靓仔'
# 将其放到一个名为headers的字典中
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36'
}
# 发起get请求,带上headers请求头,获取相应数据,并返回给content
content = requests.get(url=url, headers=headers)
# 指定utf-8编码格式
content.encoding = 'utf-8'
content = content.text
# print(content)
# 在同级目录下创建一个moudu.html文件,以w写的模式,utf-8编码格式进行写入
with open('./moudu.html', 'w', encoding='utf-8') as f:
    # 将其写入
    f.write(content)
    print("\033[31;1m某度页面爬取完成!!!\033[0m")

运行完成后,在pycharm直接打开moudu.html,如下图
在这里插入图片描述
说明带上headers请求头是相当的有必要,也常被称为U-A伪装,在以后的爬虫世界中,将会一直带着她(U-A伪装)走下去!!!

二,普通爬虫巩固

爬取笔趣阁《萌娘西游记》这篇小说对应主页面的全部内容
在这里插入图片描述

# !/usr/bin/env python
# -*- coding:utf-8 -*-
# @Author:HePengLi
# @Time:2021-03-23

# 导入模块
import requests

# 要爬取页面的url地址
url = 'http://www.xbiquge.la/3/3687/'
# 添加表头
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36'
}
# 发起get请求,带上headers请求头,获取相应数据,并返回给content
res = requests.get(url=url,headers=headers).text
print(res)

运行发现里面大量乱码内容
在这里插入图片描述
这时第一反应就是加上指定的编码格式

# !/usr/bin/env python
# -*- coding:utf-8 -*-
# @Author:HePengLi
# @Time:2021-03-23

# 导入模块
import requests

# 要爬取页面的url地址
url = 'http://www.xbiquge.la/3/3687/'
# 添加表头
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36'
}
# 发起get请求,带上headers请求头,获取相应数据,并返回给content
res = requests.get(url=url,headers=headers)
res.encoding = 'utf-8'
res = res.text
print(res)

运行看到乱码问题已经解决
在这里插入图片描述
然后就是持久化存储到本地

# !/usr/bin/env python
# -*- coding:utf-8 -*-
# @Author:HePengLi
# @Time:2021-03-23

# 导入模块
import requests

# 要爬取页面的url地址
url = 'http://www.xbiquge.la/3/3687/'
# 添加表头
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36'
}
# 发起get请求,带上headers请求头,获取相应数据,并返回给content
res = requests.get(url=url,headers=headers)
res.encoding = 'utf-8'
res = res.text
# print(res)
with open('./pexels.html', 'w', encoding='utf-8') as f:
    f.write(res)

运行完成后,将保存后的文件用pycharm打开,如下图
在这里插入图片描述
这就说明没有问题!

聚焦爬虫👇

三,数据解析

既然只想拿到网页中部分想要的数据,那么当然离不开对网页数据的解析了,数据解析打开可以分为三大类:

1,正则表达式

2,bs4

3,xpath(重点,学会xpath就相当于拿下了聚焦爬虫的半壁江山)

注:对于1和2,小编将会个用一个案例轻描淡写,重头戏放在xpath上,因为日后这个将会使用的更为广泛!

四,正则解析

注:关于正则表达式,小编在此不在赘述!点此正则表达式做简单回顾!

打开墙纸网(http://wp.58dashi.com/),用正则表达式爬取主页所有照片
在这里插入图片描述
先进入开发者工具简单分析一下
在这里插入图片描述
也就是说只要用正则表达式解析出每张图片对应的具体url,再挨个发请求即可拿到所有图片!

# !/usr/bin/env python
# -*- coding:utf-8 -*-
# @Author:HePengLi
# @Time:2021-03-23

import requests
import re

# 要爬取页面的url地址
url = 'http://wp.58dashi.com/'
# 添加表头
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36'
}
# 发起get请求,带上headers请求头,获取相应数据,并返回给content
res = requests.get(url=url,headers=headers).text

# 先将放图片的那个标签拿过来,再进行正则提取
# <img style="" src="http://cdn-ali-img-shstaticbz.shanhutech.cn/bizhi/staticwp/202012/b1713a82d6dc241be8f60ae18949ab1b--3310961495.jpg" alt="钻石,闪烁,3D,立体,颗粒">

# 使用正则表达式将页面的所有图片进行提取
redular = 'src="(.*?)" alt'
# 第一个参数位正则,第二个参数到res的字符串中,re.S表示单行匹配
img_list = re.findall(redular, res, re.S)
print(img_list)

在这里插入图片描述
运行后拿到所有图片对应的url地址。然后指定图片名字,小编将每张图片url地址–后面的部分作为图片的名字

# for循环遍历列表中的所有图片
for img in img_list:
    # 将每张图片url地址--后面的部分作为图片的名字
    img_name = img.split('--')[-1]
    print(img_name, img)

运行代码分别拿到图片名字及url
在这里插入图片描述
最后将图片持久化保存到本地

# !/usr/bin/env python
# -*- coding:utf-8 -*-
# @Author:HePengLi
# @Time:2021-03-23

import requests
import re
import os

# 判断假如没有58picture的文件夹,就创建一个
if not os.path.exists('58picture'):
    os.mkdir('58picture')
# 要爬取页面的url地址
url = 'http://wp.58dashi.com/'
# 添加表头
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36'
}
# 发起get请求,带上headers请求头,获取相应数据,并返回给content
res = requests.get(url=url,headers=headers).text

# 先将放图片的那个标签拿过来,再进行正则提取
# <img style="" src="http://cdn-ali-img-shstaticbz.shanhutech.cn/bizhi/staticwp/202012/b1713a82d6dc241be8f60ae18949ab1b--3310961495.jpg" alt="钻石,闪烁,3D,立体,颗粒">

# 使用正则表达式将页面的所有图片进行提取
redular = 'src="(.*?)" alt'
# 第一个参数位正则,第二个参数到res的字符串中,re.S表示单行匹配
img_list = re.findall(redular, res, re.S)
# print(img_list)
# for循环遍历列表中的所有图片
for img in img_list:
    # 将每张图片url地址--后面的部分作为图片的名字
    img_name = img.split('--')[-1]
    # print(img_name, img)
    # 再次对每张图片的具体url发起请求.然图片对应的是二进制数据,所以用content
    pic = requests.get(url=img, headers=headers).content
    # 下载图片保存的路径
    picture_path = '58picture/' + img_name
    # 以wb二进制格式写入
    with open(picture_path, 'wb') as f:
        f.write(pic)
        print(img_name,'\033[31;1m爬取完成!!!\033[0m')

运行完成后,打开同级目录下的58picture文件夹
在这里插入图片描述
成功爬取!!!

不知看客朋友是否和小编一样,正则表达式那就是烂大街,那么下一篇的bs4及xpath解析将会为你开启so easy之旅!

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐