项目任务:爬取当当网畅销程序设计类图书信息,爬取页面数可根据需要设置
首页地址如下:https://category.dangdang.com/cp01.54.02.00.00.00.html
1.完成提取以下畅销程序设计类图书信息:
‘书名’, ‘简介’, ‘作者’, ‘出版社’, ‘出版时间’, ‘评论排名’, ‘评论数’,‘价格’, ‘图书分类’,‘分类’,‘链接’
2.将结果输出到畅销程序设计类图书.xlsx
1 引入相关库
import random
from fake_useragent import UserAgent
import requests
import time
from bs4 import BeautifulSoup
from pandas import DataFrame
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
import wordcloud
import jieba
from collections import Counter
import imageio
爬虫之解决需要登录的网站
使用Cookies
使用Cookie方便是方便,但Cookie是服务端给你的,它是有过期时间
的,如果过期了,那你的身份信息也就无效了,需要重新登入获取了。
第一步,在网站中复制一个已登录用户的Cookie;
打开页面,点击工具栏中更多工具>开发者工具(win:ctl+shift+I mac:⌘+Option+I),选中网络(Network),在name中找到当前网址,查看右侧Headers中的Cookie,把Cookie复制下来备用。
第二步,将已登录用户的Cookie放到headers中进行请求;
# 定义动态headers 防止被锁ip
ua = UserAgent()
# 生成一个随机的PC端User-Agent(当当网会根据终端类型自动生成相应的客户端代码,桌面的和移动端是不同的,因此为保证获取的数据正确要生成特定端的代码)
pc_user_agents = [ua.chrome, ua.firefox, ua.safari, ua.edge]
random_pc_user_agent = random.choice(pc_user_agents)
headers = {
'User-Agent': random_pc_user_agent, #也可以使用 ua.random
'Cookie':'使用自己的帐号获取cookie...',#此处复制copy下来的Cookie
}
2 获取要爬的页面URL
以下是获取畅销程序设计类图书信息链接信息
https://category.dangdang.com/cp01.54.02.00.00.00.html
通过开发者工具中的跟踪工具查看导航元素,我们可以获取详情页的链接地址url.
同理我们可以查看第二页的导航,第三页的导航,分析出相关的页面导航规则,以便爬取时动态生成爬取主页的url.如畅销程序设计类图书信息各页的导航地址信息列表如下,则我们可以构造如https://category.dangdang.com/pg{}-cp01.54.02.00.00.00.html的结构。
https://category.dangdang.com/cp01.54.02.00.00.00.html
https://category.dangdang.com/pg2-cp01.54.02.00.00.00.html
https://category.dangdang.com/pg2-cp01.54.02.00.00.00.html
# 定义开始抓取的序列号,从2开始9页【这个分析查看网页代码即可发现】假如加上首页共10页
start_num = [i for i in range(1, 10, 1)]
# 1组装要爬取的页面url
for start in start_num:
if start == 1:
url = 'https://category.dangdang.com/cp01.54.06.00.00.00.html'
else:
url = 'https://category.dangdang.com/pg{}-cp01.54.06.00.00.00.html'.format(start)
3 数据获取模块
用于从网店获取最基本的html文本信息
#数据获取模块
class DataFetcher:
@staticmethod
def fetch_data(url,headers):
response = requests.get(url=url, headers=headers)
if response.status_code == 200:
return response.text
else:
raise Exception(f"Failed to fetch data: {response.status_code}")
数据解析模块请关注下一节的内容。