Python爬虫进阶(实战篇一)

news2024/10/25 21:11:54

 接,基础篇,链接:python爬虫入门(所有演示代码,均有逐行分析!)-CSDN博客


目录

1.爬取博客网站全部文章列表

ps:补充(正则表达式)

爬虫实现

爬虫代码:

 2.爬取豆瓣电影top250榜

 爬虫代码:

3.爬取北京天气十年数据

爬虫代码:


 

1.爬取博客网站全部文章列表

ps:补充(正则表达式)

PS:这里涉及到python基础语法中正则表达式的内容

课:第三阶段-09-正则表达式-基础方法_哔哩哔哩_bilibili

 实例代码:

import re

url1 = "http://www.crazyant.net/1234.html"
url2 = "http://www.crazyant.net/1234.html#comments"
url3 = "http://www.baidu.com"

pattern = r'^http://www.crazyant.net/\d+.html$'
#r;使\d这类转义字符作为一个整体出现,而不是分开的\+d的意思;\d表示一个十进制的数字 [0-9],\d+代表十进制的数字有多个

print(re.match(pattern,url1))    #ok
print(re.match(pattern,url2))    #none
print(re.match(pattern,url3))    #none

  运行结果图:

爬虫实现

创建Python Package,命名为blog_test

在package下创建url_manager.py文件,用于存放url管理器模块代码

url管理器代码:

class UrlManager():
    '''
    url管理器
    '''
 
    def __init__(self):
    #定义一个初始化函数
        self.new_urls = set()
        #新的待爬取url的集合
        self.old_urls = set()
        #已爬取url的集合
 
    def add_new_url(self, url):
    #定义新增单个url的方法一,传一个参数url
        if url is None or len(url) == 0:
        #判断url是否为空或长度为0
            return
            #符合上述条件就停止增加
        if url in self.new_urls or url in self.old_urls:
        #判断url是否已经被记录在集合里
            return
            #已经载集合里的url不新增
        self.new_urls.add(url)
        #上述干扰条件排除后,url就可以加入待爬取的集合中
 
    def add_new_urls(self,urls):
    #定义新增url的方法二,传一个参数urls
        if urls is None or len(urls) == 0:
        #判断参数urls是否为空
            return
        for url in urls:
        #不为空就将单个url循环传入单个判断url方法中经行判断存储
            self.add_new_url(url)
 
    def get_url(self):
    #定义获取新url的函数
        if self.has_new_url():
        #如果存在待爬取的url
            url = self.new_urls.pop()
            #就将待爬取的url从集合中移除并返回
            self.old_urls.add(url)
            #将移除的url加入已爬取的集合中
            return url
            #并将其返回
        else:
            return None
 
    def has_new_url(self):
    #定义一个判断url是否存在等待爬取的url
        return len(self.new_urls) > 0
        #如果待爬取集合中有元素就分返回这个集合
 
'''测试代码'''
if __name__ == "__main__":
#文件内置变量,仅在执行当前文件时可用。当此文件被调用时,此出变量不会被执行。因此测试代码时一般加上这句话
    url_manger = UrlManager()
    #调用整个类
 
    url_manger.add_new_url("url1")
    url_manger.add_new_urls(["url1", "url2"])
    #故意增加一个重复的url
    print(url_manger.new_urls, url_manger.old_urls)
 
    print("#" * 30)
    new_url = url_manger.get_url()
    print(url_manger.new_urls, url_manger.old_urls)
 
    print("#" * 30)
    new_url = url_manger.get_url()
    print(url_manger.new_urls, url_manger.old_urls)
 
    print("#" * 30)
    print(url_manger.has_new_url())

在package下创建craw_all_pages.py文件,用于存放爬虫代码

爬虫代码:

import url_manager
import requests
from bs4 import BeautifulSoup
import re

root_url = "http://www.crazyant.net"

urls = url_manager.UrlManager()
#引入之前的url管理器模块
urls.add_new_url(root_url)
#初始化url管理器

fout = open("craw_all_pages.txt", "w", encoding="utf-8")
#初始化文件,打开文件定义为可写入模式

while urls.has_new_url():
#如果有新的uel
    curr_url = urls.get_url()
    #循环获取url
    r = requests.get(curr_url, timeout=3)
    #爬取获取到的url,同时定义timeout=3,防止页面卡死
    if r.status_code != 200:
    #如果状态码不是200,
        print("error,return status_code is not 200", curr_url)
        #输出上面的句子,和当前的url
        continue
    soup = BeautifulSoup(r.text, "html.parser")
    #获取url的所有内容
    title = soup.title.string
    #soup.tite快速获取title节点,.string得到title里面的文字

    fout.write("%s\t%s\n" % (curr_url, title))
    # %s将字符串按照指定格式输出;\t:空格;\n:换行;%(curr_url, title)将前面的内容传入后面
    fout.flush()
    # 内存中的数据刷到磁盘里
    print("success:%s, %s, %d" % (curr_url, title, len(urls.new_urls)))

    links = soup.find_all("a")
    # 找到所有的a节点
    for link in links:
        href = link.get("href")
        # 获取href标签中的所有内容
        if href is None:
        # 如果href中没有内容
            continue
            # 跳过并继续执行
        pattern = r"^http://www.crazyant.net/\d+.html$"
        if re.match(pattern, href):
        #字符串匹配查找,看看href格式是否与我们所需数据格式一致
            urls.add_new_url(href)
            #将找到的href添加到

fout.close()

运行结果:

 2.爬取豆瓣电影top250榜

爬取内容:榜单数,标题,评分和评价人数。

查看豆瓣250的url,可以看到每一页都不一样,间隔25,最后一页start=225

查找需要爬取的信息 :电影排行、电影名称、电影评分和评价人数。

 爬虫代码:

1.使用requests爬取网页

2.使用BeautifulSoup实现数据解析

3.借助pandas将数据写出到Excel

import requests
from bs4 import BeautifulSoup
import pandas as pd
import pprint

#构造分页数字列表
page_indexs = range(0, 250, 25)    #从0开始到250,取不到250,每个25个数字取一个,形成一个可迭代的对象而不是列表
list(page_indexs)    #构造列表
#需要将User-agent修改成自己的
headers = {
     'User-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:131.0) Gecko/20100101 Firefox/131.0'
}

def downlode_all_htmls():
    '''
    下载所有列表页面的HTML,用于后续的分析
    '''
    htmls = []
    for idx in page_indexs:
        url = f"http://movie.douban.com/top250?start={idx}&filter="
        print("craw html:",url)
        r = requests.get(url,headers=headers)
        if r.status_code != 200:
            raise Exception("error")
        htmls.append(r.text)
    return htmls
#执行爬取
htmls = downlode_all_htmls()

def parse_single_html(html):
    '''
    解析单个HTML,得到数据
    @return list({"link","title",[label]})
    '''
    soup = BeautifulSoup(html, 'html.parser')
    #获取每个电影的信息
    article_items = (
        soup.find("div",class_="article")
            .find("ol",class_="grid_view")
            .find_all("div",class_="item")
    )
    datas = []
    for article_item in article_items:
        #排序数字
        rank = article_item.find("div",class_="pic").find("em").get_text()
        #分步实现,首先获取文章的info
        info = article_item.find("div",class_="info")
        #然后获取标题
        title = info.find("div",class_="hd").find("span",class_="title").get_text()
        #获取五星评级、评分、评价人数,span有4个,所以使用find_all
        stars = (
            info.find("div",class_="bd")
                .find("div",class_="star")
                .find_all("span")
        )
        #星级为第一个span
        rating_star = stars[0]["class"][0]
        #评分为第二个span
        rating_num = stars[1].get_text()
        #评分人数为最后一个span
        comments = stars[3].get_text()
        datas.append({
            "rank":rank,
            "title":title,
            "rating_star":rating_star.replace("rating","").replace("-t",""),     #去掉前缀和后缀
            "rating_num":rating_num,
            "comments":comments.replace("人评价","")    #把人评价去掉
        })
    return datas

#pprint可以漂亮的打印数据
pprint.pprint(parse_single_html(htmls[0]))

#执行所有的HTML页面的解析
all_datas = []
for html in htmls:
    all_datas.extend(parse_single_html(html))
print(all_datas)
print(len(all_datas))

df = pd.DataFrame(all_datas)
print(df)
#这里想直接输出excel需要安装openpyxl库
df.to_excel("豆瓣电影TOP250.xlsx")

3.爬取北京天气十年数据

爬取目标:http://tianqi.2345.com/wea_history/54511.htm

涉及技术:

headers中设置user agent反爬机制

通过network抓包,分析ajax的请求和参数

通过for循环请求不同的参数的数据

利用pandas实现excel的合并与保存

首先进入网站,更换年份、月份,发现网站地址没有改变

可以判断出,网页存在隐藏的步奏,需要对网页进行抓包操作

右键检查,选择网络(network),不关闭页面的同时,点击更改年份,抓包获取数据

点击获取到的数据,在请求头中找到Uer_Agent,也可以看到请求方式为get

 查看请求参数

查看响应内容

爬取网址 

爬虫代码:

import time
import requests
import pandas as pd
from numpy.random import random
import random

#设置随机休眠时间,防止ip被禁
time.sleep(random.random()*3)

url = "http://tianqi.2345.com/Pc/GetHistory"
#请求头,防拦截
headers = {
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.5845.97 Safari/537.36 Core/1.116.454.400 QQBrowser/13.2.6134.400",
    "Cookie":"Hm_lvt_a3f2879f6b3620a363bec646b7a8bcdd=1729388880; HMACCOUNT=52D6CD0BBA8BE5AD; Hm_lpvt_a3f2879f6b3620a363bec646b7a8bcdd=1729388945",
    "Referer":"http://tianqi.2345.com/wea_history/54511.htm"
}

def craw_table(year, month):
    """提供年费烦恼和月份爬取对应的表格数据"""
    #将参数传过来
    params = {
        "areaInfo[areaId]": 54511,
        "areaInfo[areaType]": 2,
        "date[year]": year,
        "date[month]": month
    }

    resp = requests.get(url, headers=headers, params=params)
    data = resp.json()["data"]
    #解析网页中所有的表格,取第一个元素
    df = pd.read_html(data)[0]
    return df

df_list = []
for year in range(2014, 2024):
    for month in range(1,13):
        print("爬取:",year, month)
        df = craw_table(year,month)
        df_list.append(df)

pd.concat(df_list).to_excel("北京10年天气数据.xlsx",index=False)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2223550.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java控制台打印乘法口诀表

目录 前言具体代码完整代码 前言 背乘法口诀表我没记错话,应该是我们在上小学二年级的时候,相信大家对乘法表相当熟悉,那你知道如何用java打印这个漂亮的表吗?下面咱们一起来学习学习。 具体代码 数字乘法表 关键代码&#xf…

shell编程实例1—猜数字游戏

脚本生成一个100以内的随机数,提示用户猜数字,根据用户的输入,提示用户猜对了, 猜小了或猜大了,直至用户才对数字结束 #!/bin/bash #脚本生成一个100以内的随机数,提示用户猜数字,根据用户的输…

大模型生图安全疫苗注入——进阶解决方案与系统优化(DataWhale组队学习)

引言 大家好,我是GISer Liu😁,上篇博客中,我们基于DataWhale 2024年10月大模型生图安全疫苗注入赛道的任务,介绍了攻击与防御的基本策略,如通过上下文稀释法、隐喻替换等绕过检测机制,并提出了多…

分布式IO模拟量模块:多领域应用的高效能解决方案

分布式IO模拟量模块是分布式IO系统中的重要组件,用于实现现场设备或过程的模拟量信号的采集、监视和控制。该模块通常与现场总线耦合器配合使用,能够接收来自现场设备的模拟量信号(如电流、电压等),并将其转换为数字信…

利用飞腾派进行OpenCV开发

实验目标: 完成飞腾平台OpenCV开发。 实验大纲: Mat数据结构加载、显示、保存图像读写像素RGB图像分离彩色图转灰度图 Mat数据结构 Mat是一个类,由两个数据部分组成:矩阵头(大小,通道,数据类型等)和数据块(像素 值)。创建示例…

Chat-macOS:HuggingChat 开源 MACOS 原生 AI 聊天神器,让你的 Mac 变成智能助手!

❤️ 如果你也关注大模型与 AI 的发展现状,且对大模型应用开发非常感兴趣,我会快速跟你分享最新的感兴趣的 AI 应用和热点信息,也会不定期分享自己的想法和开源实例,欢迎关注我哦! 🥦 微信公众号&#xff…

毕业设计—基于 Inception-ResNet模型的皮肤癌分类系统实现

1.摘要 皮肤癌是人类最常见的恶性肿瘤,主要通过视觉诊断进行初步临床筛查。但是由于皮肤病变外观的细微变化性,使用图像自动分类皮肤病变是一项具有挑战性的任务。本文为了提高深度学习算法在皮肤病检测上的准确率,本文提出了基于Inception和…

bootstrap模态框myModalLabel遇到做复制的功能失效解决方案整理

bootstrap模态框myModalLabel遇到做复制的功能失效解决方案整理 解决办法:标红色的去掉就可以 tabindex“-1”

SOLIDWORKS专业版企业购买多少钱一套?

SOLIDWORKS正版软件分为三个版本,主要以每个版本的功能不同对价格进行划分,SOLIDWWORKS代理商硕迪科技将为企业提供优惠的采购价格,欢迎通过电话或者在线咨询联系我们,洽谈价格和服务。 ▲ SOLIDWORKS Professional 是应用最为广…

网站建设中需要注意哪些安全问题?----雷池社区版

服务器与应用安全指南 1. 服务器安全 1.1 操作系统安全 及时更新补丁:确保操作系统始终安装最新补丁,以防范系统漏洞。例如,Windows Server 定期推送安全更新,修复如远程代码执行等潜在威胁。优化系统服务配置:关闭不…

什么是3D展厅?有哪些应用场景?

3D展厅是一种利用三维技术构建的虚拟展示空间。它借助虚拟现实(VR)、增强现实(AR)等现代科技手段,将真实的展示空间数字化,呈现出逼真、立体、沉浸的展示效果。视创云展通过整合虚拟展厅、数字人互动、音视…

【真题笔记】09-12年系统架构设计师要点总结

【真题笔记】09-12年系统架构设计师要点总结 41 视图DSSA(特定领域架构)集成系统数据库管理设计模式操作符运算符综合布线备份数据库集成工作流技术软件质量保证需求管理需求开发结构化方法企业战略数据模型事务数据库主题数据库系统设计原型开发静态分析…

组件通信八种方式(vue3)

一、父传子&#xff08;props&#xff09; 关于Props的相关内容可以参考&#xff1a;Props-CSDN博客 父组件通过 props 向子组件传递数据。适合简单的单向数据流。 <!-- Parent.vue --> <template><Child :message"parentMessage" /> </temp…

useEffect简单介绍

react组件生命周期 比如说&#xff0c;某些操作就只在初始渲染后执行&#xff0c;我们就可以使用useEffect。 useEffect(function () {fetch(http://www.omdbapi.com/?apikey${KEY}&sinterstellar).then((res) > res.json()).then((data) > setMovies(data.Search)…

[C#][winform]基于yolov5的驾驶员抽烟打电话安全带检测系统C#源码+onnx模型+评估指标曲线+精美GUI界面

【重要说明】 该系统以opencvsharp作图像处理,onnxruntime做推理引擎&#xff0c;使用CPU进行推理&#xff0c;适合有显卡或者没有显卡windows x64系统均可&#xff0c;不支持macOS和Linux系统&#xff0c;不支持x86的windows操作系统。由于采用CPU推理&#xff0c;要比GPU慢。…

传统数据仓库升级版:云数据仓库!

随着公司业务拓展&#xff0c;数据爆炸性增长&#xff0c;数据驱动的见解已成为决策过程中关键指标。对公司来说&#xff0c;怎么选择存储所有这些信息的简单方法并运行必要的数据分析以获得有用的见解变得更加重要。 在过去的50多年里&#xff0c;传统的本地数据仓库一直是一…

ffmpeg视频滤镜:腐蚀滤镜

滤镜简述 erosion 官网链接> FFmpeg Filters Documentation 这个滤镜会在视频上应用腐蚀操作&#xff0c;腐蚀操作是形态学中一种操作&#xff0c;接触过opencv的同学应该很熟悉。滤镜主要有如下作用&#xff1a; 去除噪声&#xff1a;腐蚀可以帮助去除图像中的小颗粒噪…

构建后端为etcd的CoreDNS的容器集群(六)、编写自动维护域名记录的代码脚本

本文为系列测试文章&#xff0c;拟基于自签名证书认证的etcd容器来构建coredns域名解析系统。 一、前置文章 构建后端为etcd的CoreDNS的容器集群&#xff08;一&#xff09;、生成自签名证书 构建后端为etcd的CoreDNS的容器集群&#xff08;二&#xff09;、下载最新的etcd容…

pytorch训练和使用resnet

pytorch训练和使用resnet 使用 CIFAR-10数据集 训练 resnet resnet-train.py import torch import torchvision import torchvision.transforms as transforms import torch.nn as nn import torch.optim as optim# 在CIFAR-10数据集中 # 训练集&#xff1a;包含50000张图像…

城市极客,存内先锋-存内社区主理人招募令

在这个数据驱动的时代&#xff0c;存内计算正成为推动技术革新的核心力量。 我们&#xff0c;存内计算社区&#xff0c;正站在这场革命的前沿&#xff0c;现在&#xff0c;我们正式发出召集令&#xff0c;寻找那些渴望引领技术浪潮的城市站主理人&#xff01; 地点&#xff1a…