网页分析
节约时间,不废话介绍了,直接上例子!!!
我们就使用 requests 和 BeautifulSoup来写一个爬虫
作为一个爱看书的你(说的跟真的似的)
怎么能发现好书呢? 所以我们学习 500 本好五星评书籍 怎么样?
ok 接下来就是学习 python 的正确姿势,请在电脑的陪同下边看本文边练习。
首先我们要对我们的目标网站进行分析先摸清对方的底我们才能战无不胜
打开这个书籍排行榜的地址
http://bang.dangdang.com/books/fivestars/01.00.00.00.00.00-recent30-0-0-1-1
我们可以看到是这样的一个网页
每一页显示 20 本书当我们点击下一页的时候你可以发现地址变了
http://bang.dangdang.com/books/fivestars/01.00.00.00.00.00-recent30-0-0-1-2
也就是我们翻到第几页的时候,链接地址的最后一个参数会跟着变
那么我们等会在 python 中可以用一个变量,来实现获取不同页数的内容
接着操作来分析一下我们要的内容是怎么请求的,以及返回给我们的源代码是什么样的。
可以看到我们通过 GET 请求
我们的请求头
这是服务器返回来的数据
接着我们再来分析一下我们要抓取的关键信息
我们要的就是前 500 本书的
排名
书名
图片地址
作者
详情页
五星评分次数
价格
通过源码我们可以看到这些信息被放在了 li 标签中
那么我们等会就可以使用BeautifulSoup来进行过滤我们要的信息一顿分析完了之后接下来撸代码了。
主要思路
使用 page 变量来实现翻页
我们使用 requests 请求当当网
然后将返回的 HTML 进行BeautifulSoup解析
解析完之后就把内容存到文件中
请求当当网当我们请求成功之后拿到源代码
拿到源代码了就要对其解析使用BeautifulSoup获取我们想要的关键信息获取到了之后我们封装一下数据
打印一下看看结果
随后再把书的封面给下载下来,
没毛病!!!获取完 500 本书的数据之后存到 当当图书.xlsx文件
完成,前 500 本书的数据就被我们拿到啦
这是成果:
以下是全部代码:
import requests
import csv
from bs4 import BeautifulSoup
from lxml import etree
import xlwt
import os.path
import re
def get_content(url):
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36'}
try:
response = requests.get(url,headers)
if response.status_code == 200:
return response.text
except requests.RequestException as e:
print(e)
return None
book = xlwt.Workbook(encoding='utf-8', style_compression=0)
sheet = book.add_sheet('豆瓣电影Top250', cell_overwrite_ok=True)
sheet.write(0, 0, '排名')
sheet.write(0, 1, '名称')
sheet.write(0, 2, '评论')
sheet.write(0, 3, '图片')
sheet.write(0, 4, '详情页')
sheet.write(0, 5, '价钱')
sheet.write(0, 6, '作者')
n = 1
def get_data(response):
soup = BeautifulSoup(response,'lxml')
all_list = soup.find(class_="bang_list clearfix bang_list_mode").find_all('li')
item = {}
for i in all_list:
ranking = i.find('div').string
title = i.find('div',class_="name").find('a').text
pf = i.find('div',class_="biaosheng").find('span').string
Images = i.find('a').find('img').get('src')
ditail = i.find('a').get('href')
monmy = i.find('p').find('span',class_="price_n").string.strip('¥')
if i.find(class_="publisher_info").find('a') is not None: # 处理没有找到相应标签的 并继续执行下去
aoter = i.find(class_="publisher_info").find('a').text
else:
aoter = 'NOT AVAILABLE'
print('爬取===>','\n' + ranking,'\n',title,'\n',pf,'\n',Images,'\n',ditail,'\n',monmy,'\n',aoter)
save_Images(Images,title)
save_csv(ranking,title,pf,Images,ditail,monmy,aoter)
def save_csv(ranking,title,pf,Images,ditail,monmy,aoter):
global n
sheet.write(n, 0, ranking)
sheet.write(n, 1, title)
sheet.write(n, 2, pf)
sheet.write(n, 3, Images)
sheet.write(n, 4, ditail)
sheet.write(n, 5, monmy)
sheet.write(n, 6, aoter)
n = n + 1
def save_Images(Images,title):
if not os.path.exists('当当图片'):
os.mkdir('当当图片')
big = '[?<>|"/\:]'
new_title = re.sub(big,"",title)
image_data = requests.get(Images).content
with open('当当图片\\' + new_title + '.jpg',mode='wb')as f:
f.write(image_data)
print('正在保存图片:',title)
def main(page):
url = 'http://bang.dangdang.com/books/fivestars/1-' + str(page)
print(f'=========================================正在爬取第{page}页的数据============================================')
response = get_content(url)
get_data(response)
if __name__ == '__main__':
for i in range(1,26):
main(i)
book.save(u'当当图书.xlsx')
友们你们支持是我最大的动力。