python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python爬虫案例

Python7个爬虫小案例详解(附源码)下篇

作者:艾派森

这篇文章主要介绍了Python7个爬虫小案例详解(附源码)上篇,本文章内容详细,通过案例可以更好的理解爬虫的相关知识,七个例子分为了三部分,本次为下篇,共有三道题,需要的朋友可以参考下

本次的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个爬虫小案例详解(附源码)下篇的文章就介绍到这了,其他两个部分的内容(上、中篇)请搜索脚本之家以前的文章或继续浏览下面的相关文章。

好了,本次七个案例的分享到此全部结束,希望对刚入手爬虫的小伙伴有所帮助。

 希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文