Python7个爬虫小案例详解(附源码)下篇|全球速讯
目录
前言题目五:实现多种方法模拟登录知乎,并爬取与一个与江汉大学有关问题和答案题目六:综合利用所学知识,爬取某个某博用户前5页的微博内容题目七:自选一个热点或者你感兴趣的主题,爬取数据并进行简要数据分析本次的7个python爬虫小案例涉及到了re正则、xpath、beautiful soup、selenium等知识点,非常适合刚入门python爬虫的小伙伴参考学习。
【资料图】
前言
关于Python7个爬虫小案例的文章分为三篇,本篇为下篇,共三题,其余两篇内容请关注!
题目五:
实现多种方法模拟登录知乎,并爬取与一个与江汉大学有关问题和答案
首先使用selenium打开知乎登录页面,接着使用手机进行二维码扫描登录
进入页面后,打开开发者工具,找到元素,,定位输入框,输入汉江大学,然后点击搜索按钮
以第二条帖子为例,进行元素分析。
源代码及结果截图:
from time import sleep
from selenium.webdriver.chrome.service import Service
from selenium.webdriver import Chrome,ChromeOptions
from selenium.webdriver.common.by import By
import warnings
def main():
#忽略警告
warnings.filterwarnings("ignore")
# 创建一个驱动
service = Service("chromedriver.exe")
options = ChromeOptions()
# 伪造浏览器
options.add_experimental_option("excludeSwitches", ["enable-automation","enable-logging"])
options.add_experimental_option("useAutomationExtension", False)
# 创建一个浏览器
driver = Chrome(service=service,options=options)
# 绕过检测
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """
Object.defineProperty(navigator, "webdriver", {
get: () => false
})
"""
})
# 打开知乎登录页面
driver.get("https://www.zhihu.com/")
sleep(30)
# 点击搜索框
driver.find_element(By.ID,"Popover1-toggle").click()
# 输入内容
driver.find_element(By.ID,"Popover1-toggle").send_keys("汉江大学")
sleep(2)
# 点击搜索图标
driver.find_element(By.XPATH,"//*[@id="root"]/div/div[2]/header/div[2]/div[1]/div/form/div/div/label/button").click()
# 等待页面加载完
driver.implicitly_wait(20)
# 获取标题
title = driver.find_element(By.XPATH,"//*[@id="SearchMain"]/div/div/div/div/div[2]/div/div/div/h2/div/a/span").text
# 点击阅读全文
driver.find_element(By.XPATH,"//*[@id="SearchMain"]/div/div/div/div/div[2]/div/div/div/div/span/div/button").click()
sleep(2)
# 获取帖子内容
content = driver.find_element(By.XPATH,"//*[@id="SearchMain"]/div/div/div/div/div[2]/div/div/div/div/span[1]/div/span/p").text
# 点击评论
driver.find_element(By.XPATH,"//*[@id="SearchMain"]/div/div/div/div/div[2]/div/div/div/div/div[3]/div/div/button[1]").click()
sleep(2)
# 点击获取更多评论
driver.find_element(By.XPATH,"//*[@id="SearchMain"]/div/div/div/div/div[2]/div/div/div/div[2]/div/div/div[2]/div[2]/div/div[3]/button").click()
sleep(2)
# 获取评论数据的节点
divs = driver.find_elements(By.XPATH,"/html/body/div[6]/div/div/div[2]/div/div/div/div[2]/div[3]/div")
try:
for div in divs:
# 评论内容
comment = div.find_element(By.XPATH,"./div/div/div[2]").text
f.write(comment) # 写入文件
f.write("\n")
print(comment)
except:
driver.close()
if __name__ == "__main__":
# 创建文件存储数据
with open("05.txt","a",encoding="utf-8")as f:
main()题目六:
综合利用所学知识,爬取某个某博用户前5页的微博内容
这里我们选取了人民日报的微博内容进行爬取,具体页面我就不放这了,怕违规。
源代码:
import requests
import csv
from time import sleep
import random
def main(page):
url = f"https://weibo.com/ajax/statuses/mymblog?uid=2803301701&page={page}&feature=0&since_id=4824543023860882kp{page}"
headers = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36",
"cookie":"SINAGLOBAL=6330339198688.262.1661412257300; ULV=1661412257303:1:1:1:6330339198688.262.1661412257300:; PC_TOKEN=8b935a3a6e; SUBP=0033WrSXqPxfM725Ws9jqgMF55529P9D9WWoQDW1G.Vsux_WIbm9NsCq5JpX5KMhUgL.FoMNShMN1K5ESKq2dJLoIpjLxKnL1h.LB.-LxKqLBoBLB.-LxKqLBKeLB--t; ALF=1697345086; SSOLoginState=1665809086; SCF=Auy-TaGDNaCT06C4RU3M3kQ0-QgmTXuo9D79pM7HVAjce1K3W92R1-fHAP3gXR6orrHK_FSwDsodoGTj7nX_1Hw.; SUB=_2A25OTkruDeRhGeFJ71UW-S7OzjqIHXVtOjsmrDV8PUNbmtANLVKmkW9Nf9yGtaKedmyOsDKGh84ivtfHMGwvRNtZ; XSRF-TOKEN=LK4bhZJ7sEohF6dtSwhZnTS4; WBPSESS=PfYjpkhjwcpEXrS7xtxJwmpyQoHWuGAMhQkKHvr_seQNjwPPx0HJgSgqWTZiNRgDxypgeqzSMsbVyaDvo7ng6uTdC9Brt07zYoh6wXXhQjMtzAXot-tZzLRlW_69Am82CXWOFfcvM4AzsWlAI-6ZNA=="
}
resp = requests.get(url,headers=headers)
data_list = resp.json()["data"]["list"]
for item in data_list:
created_time = item["created_at"] # 发布时间
author = item["user"]["screen_name"] # 作者
title = item["text_raw"] # 帖子标题
reposts_count = item["reposts_count"] # 转发数
comments_count = item["comments_count"] # 评论数
attitudes_count = item["attitudes_count"] # 点赞数
csvwriter.writerow((created_time,author,title,reposts_count,comments_count,attitudes_count))
print(created_time,author,title,reposts_count,comments_count,attitudes_count)
print(f"第{page}页爬取完毕")
if __name__ == "__main__":
# 创建保存数据的csv文件
with open("06-2.csv","a",encoding="utf-8",newline="")as f:
csvwriter = csv.writer(f)
# 添加文件表头
csvwriter.writerow(("发布时间","发布作者","帖子标题","转发数","评论数","点赞数"))
for page in range(1,6): # 爬取前5页数据
main(page)
sleep(5+random.random())题目七:
自选一个热点或者你感兴趣的主题,爬取数据并进行简要数据分析
(例如,通过爬取电影的名称、类型、总票房等数据统计分析不同类型电影的平均票房,十年间每年票房冠军的票房走势等;通过爬取中国各省份地区人口数量,统计分析我国人口分布等)
本次选取的网址是艺恩娱数,目标是爬取里面的票房榜数据,通过开发者工具抓包分析找到数据接口,然后开始编写代码进行数据抓取。
源代码及结果截图:
import requests
import csv
import pandas as pd
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings("ignore")
plt.rcParams["font.sans-serif"] = ["SimHei"] #解决中文显示
plt.rcParams["axes.unicode_minus"] = False #解决符号无法显示
def main():
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36",}
data = {
"r": "0.9936776079863086",
"top": "50",
"type": "0",
}
resp = requests.post("https://ys.endata.cn/enlib-api/api/home/getrank_mainland.do", headers=headers, data=data)
data_list = resp.json()["data"]["table0"]
for item in data_list:
rank = item["Irank"] # 排名
MovieName = item["MovieName"] # 电影名称
ReleaseTime = item["ReleaseTime"] # 上映时间
TotalPrice = item["BoxOffice"] # 总票房(万)
AvgPrice = item["AvgBoxOffice"] # 平均票价
AvgAudienceCount = item["AvgAudienceCount"] # 平均场次
# 写入csv文件
csvwriter.writerow((rank,MovieName,ReleaseTime,TotalPrice,AvgPrice,AvgAudienceCount))
print(rank,MovieName,ReleaseTime,TotalPrice,AvgPrice,AvgAudienceCount)
def data_analyze():
# 读取数据
data = pd.read_csv("07.csv")
# 从上映时间中提取出年份
data["年份"] = data["上映时间"].apply(lambda x: x.split("-")[0])
# 各年度上榜电影总票房占比
df1 = data.groupby("年份")["总票房(万)"].sum()
plt.figure(figsize=(6, 6))
plt.pie(df1, labels=df1.index.to_list(), autopct="%1.2f%%")
plt.title("各年度上榜电影总票房占比")
plt.show()
# 各个年份总票房趋势
df1 = data.groupby("年份")["总票房(万)"].sum()
plt.figure(figsize=(6, 6))
plt.plot(df1.index.to_list(), df1.values.tolist())
plt.title("各年度上榜电影总票房趋势")
plt.show()
# 平均票价最贵的前十名电影
print(data.sort_values(by="平均票价", ascending=False)[["年份", "电影名称", "平均票价"]].head(10))
# 平均场次最高的前十名电影
print(data.sort_values(by="平均场次", ascending=False)[["年份", "电影名称", "平均场次"]].head(10))
if __name__ == "__main__":
# 创建保存数据的csv文件
with open("07.csv", "w", encoding="utf-8",newline="") as f:
csvwriter = csv.writer(f)
# 添加文件表头
csvwriter.writerow(("排名", "电影名称", "上映时间", "总票房(万)", "平均票价", "平均场次"))
main()
# 数据分析
data_analyze()从年度上榜电影票房占比来看,2019年占比最高,说明2019年这一年的电影质量都很不错,上榜电影多而且票房高。
从趋势来看,从2016年到2019年,上榜电影总票房一直在增长,到2019年达到顶峰,说明这一年电影是非常的火爆,但是从2020年急剧下滑,最大的原因应该是这一年年初开始爆发疫情,导致贺岁档未初期上映,而且由于疫情影响,电影院一直处于关闭状态,所以这一年票房惨淡。
这篇关于Python7个爬虫小案例详解(附源码)下篇的文章就介绍到这了,其他两个部分的内容(上、中篇)请搜索脚本之家以前的文章或继续浏览下面的相关文章。
好了,本次七个案例的分享到此全部结束,希望对刚入手爬虫的小伙伴有所帮助。
希望大家以后多多支持脚本之家!
X 关闭
X 关闭
- 15G资费不大降!三大运营商谁提供的5G网速最快?中国信通院给出答案
- 2联想拯救者Y70发布最新预告:售价2970元起 迄今最便宜的骁龙8+旗舰
- 3亚马逊开始大规模推广掌纹支付技术 顾客可使用“挥手付”结账
- 4现代和起亚上半年出口20万辆新能源汽车同比增长30.6%
- 5如何让居民5分钟使用到各种设施?沙特“线性城市”来了
- 6AMD实现连续8个季度的增长 季度营收首次突破60亿美元利润更是翻倍
- 7转转集团发布2022年二季度手机行情报告:二手市场“飘香”
- 8充电宝100Wh等于多少毫安?铁路旅客禁止、限制携带和托运物品目录
- 9好消息!京东与腾讯续签三年战略合作协议 加强技术创新与供应链服务
- 10名创优品拟通过香港IPO全球发售4100万股 全球发售所得款项有什么用处?

