前言
爬新闻的时候找到了一个有意思的网站
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)