Python爬虫实战——快科技·科技快讯板块(正则匹配,网页解码,动态加载)

前言

        爬新闻的时候找到了一个有意思的网站

url = ‘https://news.mydrivers.com/’

这网站第一是要爬取的数据是动态加载出来的(向下滑动,自动加载),第二是我找到的接口还被转码加密了(不过处理起来也不是很难)

依赖包

import openpyxl
import requests
import re
from tqdm import tqdm

 tqdm是一个生成进度条的包

爬取准备

1.看网页的爬虫协议,根网址后面加/robots.txt就可以看到了

看说明是只要不爬直播的内容就没事

2.观察网页数据返回(F12)

 

 这边我找到了个返回来的文件(其他的都是些返回来的图片),数据应该就藏在这个接口这里,现在对?之后的网址进行一下删除,只保留page之前的网址。

 可以看到链接访问进去是有东西的,但是被转码加密了一下,复制到pycharm里面看看

 也就是对网页源代码进行编码加密了,这个处理起来也简单

# 网页套了一层壳,解码网页
req = requests.get(url).text.encode('utf8').decode("unicode_escape")

在get请求后面加上

.encode('utf8').decode("unicode_escape")

就可以解决这个问题

 我又双对网址观察了一下发现

 

 page代表着页数,这个ac代表着这些分类,到这里基本上着网站的数据我们都可以拿到了

数据爬取

1.前期准备

header = {
    'User-Agent': '',
    'cookie': ''
}

# 要获取的分类
cate = ['最新', '热文', '热评', '一图', '好文', '数据', '人物', '手机', '动态', '电脑', '汽车', '影音', '软件',
        '游戏', '科学', 'IT圈', 'CPU', '显卡', '硬盘', '显示器', '内存', '安卓', 'iPhone', 'Windows', '微信', '华为',
        '小米', '苹果', '英特尔', '英伟达', 'AMD', '特斯拉', '索尼', 'OPPO', 'VIvo', '荣耀', '京东', '美团',
        '字节跳动', '阿里巴巴', '支付宝', '腾讯', '微软', '百度', '谷歌', '三星', '比亚迪', '蔚来', '理想', '小鹏',
        '埃安']

 设置一下头文件,cate是我想要的分类(不想再写个爬虫爬这些文本了就手敲了),放进列表里面

2.爬取文章的链接

就这样用re匹配出来,然后还对匹配出来的数据进行了清洗,所以在列表里面才有那么多空的,这些我们后面再处理

爬取链接的代码:

def mydrivwes_url(cate):
    x = 1
    for a in tqdm(range(1, 52)):
        for b in range(1, 91):
            try:
                # 拼接链接
                url = 'https://blog.mydrivers.com/news/getdatelist20200820.aspx?ac=' + str(
                    a) + '&timeks=&timeend=&page=' + str(b)
                # 网页套了一层壳,解码网页
                req = requests.get(url).text.encode('utf8').decode("unicode_escape")
                # 获取新闻链接
                r = re.findall(r'<a href="(.*?)"', req, re.S)
                urll = []
                # 清洗正则匹配到的链接
                for i in r:
                    urll.append(re.sub(r'javascript.*', '', i))
                # 解析和保存数据函数
                x = mydrivwes_data(urll, a, cate, x)  # 调用函数(获取到的新闻链接,分类对应的位置,分类,数据写入到Excel第几行上)
            except Exception as arr:
                print(arr)
                continue

 3.对获取到的链接进行访问,拿到我们需要的数据,然后保存到Excel里面

 这里还要设置一下编码,不能直接拿文本,不然中文就会乱码

然后就是对拿到的网页源代码进行正则匹配啊,简单的清洗啊什么的,最后再写进Excel

访问链接的时候会有部分报错,不过我也做了异常处理(这么多的数据少几页的数据问题不大owo),爬不到的就算了

解析和写入Excel代码:

def mydrivwes_data(url, a, cate, x):
    # 打开一个已经有的Excel文件
    f = openpyxl.load_workbook(r'D:\工作文件\科技新闻.xlsx')
    sheet = f.active
    for j in set(url):
        data = []
        dody = []
        if j != '':
            # 爬取数据,设置解析网页的编码
            req = requests.get(j, headers=header)
            req.encoding = 'utf8'
            # 获取数据(正则匹配)
            data.append([cate[a - 1]])  # 分类
            data.append(list(set(re.findall(r'<i>#</i>(.*?)</a>', req.text, re.S))))  # 标签
            data.append(re.findall(r'<div class="news_bt" id="thread_subject">(.*?)</div>', req.text, re.S))  # 标题
            # 获取正文数据,对正文进行一下处理
            for k in re.findall(r'<p>(.*?)</p>', re.findall(r'<div class="news_info">(.*?)</div>', req.text, re.S)[0],
                                re.S):
                dody.append(re.sub('&.*?;', '', re.sub(r'<.*?>', '', k)))  # 简单清洗一下拿到的数据
            data.append(dody)  # 正文
            data.append([j])  # 爬取的链接
            # 把数据写入Excel
            for y in range(len(data)):
                sheet.cell(x, y+1).value = '\n'.join(data[y])
            x += 1
    # 保存数据
    f.save(r'D:\工作文件\科技新闻.xlsx')
    return x  # 返回写入的行数

总结

        爬这个网站的时候还是很有意思的,毕竟遇到了很多之前没遇到的情况。不过呢,这代码也写的有些问题第一是没对拿到的链接做一个去重,有些新闻的数据会被重复爬取(这个后期可以在Excel里面进行处理),第二是拿的数据量太多了,没写多线程(其实是还没会写qwq),用的单线程爬的,爬了两天吧(毕竟是51*90=4590页的数据)。

完整代码

# -- coding: utf-8 --
# @Time : 2023/3/1 16:08
# @File : mydrivers_spider.py
# @Software: PyCharm


import time
import json
import openpyxl
import requests
import re
from lxml import etree
from tqdm import tqdm

header = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36',
    'cookie': 'Hm_lvt_fa993fdd33f32c39cbb6e7d66096c422=1677656055; _ga=GA1.2.85175217.1677656056; _gid=GA1.2.1459179838.1677656056; __gads=ID=a49feffc530281e8-221e4d5f46da00d5:T=1677656343:RT=1677656343:S=ALNI_MZgiorrxc7wFkMAC5KPy1igUUYhkg; __gpi=UID=00000bcf6731797b:T=1677656343:RT=1677656343:S=ALNI_MaFn13jlgmEIsjJSwUPOvVtsbQXeg; CSRFToken=858ff98f521e41d3ae128e65f0574db6; Hm_lpvt_fa993fdd33f32c39cbb6e7d66096c422=1677662913'
}

# 要获取的分类
cate = ['最新', '热文', '热评', '一图', '好文', '数据', '人物', '手机', '动态', '电脑', '汽车', '影音', '软件',
        '游戏', '科学', 'IT圈', 'CPU', '显卡', '硬盘', '显示器', '内存', '安卓', 'iPhone', 'Windows', '微信', '华为',
        '小米', '苹果', '英特尔', '英伟达', 'AMD', '特斯拉', '索尼', 'OPPO', 'VIvo', '荣耀', '京东', '美团',
        '字节跳动', '阿里巴巴', '支付宝', '腾讯', '微软', '百度', '谷歌', '三星', '比亚迪', '蔚来', '理想', '小鹏',
        '埃安']


def mydrivwes_url(cate):
    x = 1
    for a in tqdm(range(1, 52)):
        for b in range(1, 91):
            try:
                # 拼接链接
                url = 'https://blog.mydrivers.com/news/getdatelist20200820.aspx?ac=' + str(
                    a) + '&timeks=&timeend=&page=' + str(b)
                # 网页套了一层壳,解码网页
                req = requests.get(url).text.encode('utf8').decode("unicode_escape")
                # 获取新闻链接
                r = re.findall(r'<a href="(.*?)"', req, re.S)
                urll = []
                # 清洗正则匹配到的链接
                for i in r:
                    urll.append(re.sub(r'javascript.*', '', i))
                # 解析和保存数据函数
                x = mydrivwes_data(urll, a, cate, x)  # 调用函数(获取到的新闻链接,分类对应的位置,分类,数据写入到Excel第几行上)
            except Exception as arr:
                print(arr)
                continue


def mydrivwes_data(url, a, cate, x):
    # 打开一个已经有的Excel文件
    f = openpyxl.load_workbook(r'D:\工作文件\科技新闻.xlsx')
    sheet = f.active
    for j in set(url):
        data = []
        dody = []
        if j != '':
            # 爬取数据,设置解析网页的编码
            req = requests.get(j, headers=header)
            req.encoding = 'utf8'
            # 获取数据(正则匹配)
            data.append([cate[a - 1]])  # 分类
            data.append(list(set(re.findall(r'<i>#</i>(.*?)</a>', req.text, re.S))))  # 标签
            data.append(re.findall(r'<div class="news_bt" id="thread_subject">(.*?)</div>', req.text, re.S))  # 标题
            # 获取正文数据,对正文进行一下处理
            for k in re.findall(r'<p>(.*?)</p>', re.findall(r'<div class="news_info">(.*?)</div>', req.text, re.S)[0],
                                re.S):
                dody.append(re.sub('&.*?;', '', re.sub(r'<.*?>', '', k)))  # 简单清洗一下拿到的数据
            data.append(dody)  # 正文
            data.append([j])  # 爬取的链接
            # 把数据写入Excel
            for y in range(len(data)):
                sheet.cell(x, y+1).value = '\n'.join(data[y])
            x += 1
    # 保存数据
    f.save(r'D:\工作文件\科技新闻.xlsx')
    return x  # 返回写入的行数


if __name__ == '__main__':
    mydrivwes_url(cate)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值