作为一个python学习者,那么今天我就教大家用python实现写一个小实战,轻轻松松的把网址的所需要的信息保存到你的电脑里。
往期内容回顾
【python】 字典使用教程(超级详细)不看 你怎么够别人卷
【python教程】保姆版教使用pymysql模块连接MySQL实现增删改查
selenium自动化测试实战案例哔哩哔哩信息至Excel
舍友打一把游戏的时间,我实现了一个selenium自动化测试并把数据保存到MySQL
主要相关模块
在实现之前第一步还是先对网页进行分析,确定网页是静态的还是动态的,知己知彼才好下手,是吧!以避开爬取难点,节约时间,我们打开网页右键检查输入关键字发现可以找到信息,我们大致可以确定这个网站是静态的。那么我们就可以根据普通的方法对网页进行抓取。
既然我们确定了网页是静态的,那再继续分析网页看看还有我们什么所需要的信息,比如我们翻页看看会有怎样的变化,这里我们发现URLp这里的数字变了,这不代表着要实现翻页我们只需变化这数字不就ok。
/p2/
/p3/
/p4/
而这些小说都存在div=class=“rankpage_box” 下面的每一个div标签中,后面通过BeautifulSoup拿到它们就能获取里面所需的信息了。
导入相对应的库,发起请求。
注意:现在各大网站都有反爬机制,所以我们要对我们的爬虫进行伪装,让它模仿浏览器访问,这样网站就检测不到访问他的是爬虫程序啦。所以我们要给爬虫设置请求头,将网页的User-Agent复制到代码里
拿到网页源码后BeautifulSoup实例化对象,找到全部小说的div,遍历提取里面所需信息,这里提取了(书名,图片封面,月票数,详情页网址)
有了详情页对发起请求,实例化对象,提取详情页提取其他信息,把字典信息填进列表最后来个返回值给函数。
调用其他函数进行其相关的操作,这里是将信息保存至Excel中。
封面的保存
最后在主函数中设置翻页实现,一共10页的内容。
import requests
from bs4 import BeautifulSoup
import re
import csv
from fake_useragent import UserAgent
import os.path
num = 1
class spider(object):
# 魔法方法
def __init__(self):
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36'}
# 对象属性
self.header = headers
def content(self,url):
try:
# 发起请求
response = requests.get(url,self.header)
if response.status_code == 200:
return response.text
except Exception as e:
print(e)
def get_data(self,response):
#
all_list = []
# 实例化
soup = BeautifulSoup(response,'lxml')
# 全部div
all_data = soup.find('div',class_="rankpage_box").find_all('div',class_="rank_d_list borderB_c_dsh clearfix")
# 遍历提取信息
for i in all_data:
item = {} # 字典
item['title'] = i.find('div',class_="rank_d_b_name").find('a').text
item['images'] = i.find('a').find('img').get('src')
item['num'] = i.find(class_="rank_d_b_ticket").text
# 详情页
detalis = i.find('a').get('href')
# 详情页请求
new_rsponse = requests.get(url=detalis,headers=self.header).text
# 实例化
new_di = BeautifulSoup(new_rsponse,'lxml')
# 提取信息
try:
item['scroc'] = new_di.find(class_="nums").text.replace(' ','')
except:
item['scroc'] = 'NOT'
try:
item['manages'] = new_di.find(class_="book-dec Jbook-dec hide").find('p').text
except:
item['manages'] = 'NOT'
# 获取字典图片
images = item.get('images')
#
self.save_images(images)
#
all_list.append(item)
return all_list
def save_csv(self,all_list):
# 打开文件
with open('纵横网.csv',mode='a+',newline='',encoding='utf-8')as f:
writer = csv.DictWriter(
f,fieldnames=['书名','图片','月票','评分信息','详情']
)
writer.writeheader()
# 写入内容
for i in all_list:
writer.writerow(
{
'书名':i['title'],
'图片': i['images'],
'月票': i['num'],
'评分信息': i['scroc'],
'详情': i['manages'],
}
)
def save_images(self,images):
global num
#
if not os.path.exists('./纵横小说/'):
os.mkdir('./纵横小说/')
# 请求
images_re = requests.get(images,self.header).content
# 保存
with open('./纵横小说/' + str(num) + '.jpg',mode='wb')as f:
f.write(images_re)
num += 1
def main(self):
for i in range(1,11):
url = f'http://www.zongheng.com/rank/details.html?rt=1&d=1&p={i}'
print(f'================保存第{i}页的内容=============')
response = self.content(url)
all_list = self.get_data(response)
self.save_csv(all_list)
if __name__ == '__main__':
mood = spider()
mood.main()