Python爬虫进阶(实战篇一)

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


目录

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

ps:补充(正则表达式)

爬虫实现

爬虫代码:

 2.爬取豆瓣电影top250榜

 爬虫代码:

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

爬虫代码:


 

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

ps:补充(正则表达式)

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

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

 实例代码:

import reurl1 = "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的方法一,传一个参数urlif url is None or len(url) == 0:#判断url是否为空或长度为0return#符合上述条件就停止增加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的方法二,传一个参数urlsif urls is None or len(urls) == 0:#判断参数urls是否为空returnfor url in urls:#不为空就将单个url循环传入单个判断url方法中经行判断存储self.add_new_url(url)def get_url(self):#定义获取新url的函数if self.has_new_url():#如果存在待爬取的urlurl = self.new_urls.pop()#就将待爬取的url从集合中移除并返回self.old_urls.add(url)#将移除的url加入已爬取的集合中return url#并将其返回else:return Nonedef has_new_url(self):#定义一个判断url是否存在等待爬取的urlreturn len(self.new_urls) > 0#如果待爬取集合中有元素就分返回这个集合'''测试代码'''
if __name__ == "__main__":
#文件内置变量,仅在执行当前文件时可用。当此文件被调用时,此出变量不会被执行。因此测试代码时一般加上这句话url_manger = UrlManager()#调用整个类url_manger.add_new_url("url1")url_manger.add_new_urls(["url1", "url2"])#故意增加一个重复的urlprint(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 reroot_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():
#如果有新的uelcurr_url = urls.get_url()#循环获取urlr = 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)#输出上面的句子,和当前的urlcontinuesoup = 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()#分步实现,首先获取文章的infoinfo = article_item.find("div",class_="info")#然后获取标题title = info.find("div",class_="hd").find("span",class_="title").get_text()#获取五星评级、评分、评价人数,span有4个,所以使用find_allstars = (info.find("div",class_="bd").find("div",class_="star").find_all("span"))#星级为第一个spanrating_star = stars[0]["class"][0]#评分为第二个spanrating_num = stars[1].get_text()#评分人数为最后一个spancomments = 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 dfdf_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.rhkb.cn/news/456642.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uniapp uview 上传图片,数据以formData + File 形式传输

期望 后端期望前端给的传参为 formData 形式, 同时文件的数据类型为File 形式. 解决过程 将文件处理为 File 格式 uview 中的 upload 组件点击上传之后不是标准的 File 形式,点击上传单个文件之后的控制台信息如下: [{"url": "blob:http://localhost:8081/…

《Sui区块链:重塑去中心化应用的新星与未来潜力》

目录 引言 一、Sui 1、 技术架构 2、 编程语言 3、Move起源 4、Move的几个关键点: 5、Move 智能合约编程语言 6、智能合约编程语言可以做什么 7、和其他编程语言有什么不同 8、 安全性 9、开发者体验 10、生态系统 11、 未来发展 总结 引言 在区块链技…

鸿蒙到底是不是纯血?到底能不能走向世界?

关注卢松松,会经常给你分享一些我的经验和观点。 2016年5月鸿蒙系统开始立项。 2018年美国开始经济战争,其中一项就是制裁华为,不让华为用安卓。 2019年8月9日华为正式发布鸿蒙系统。问题就出在这里,大家可以仔细看。 安卓一…

kafka 的高可用机制是什么?

大家好,我是锋哥。今天分享关于【kafka 的高可用机制是什么?】面试题?希望对大家有帮助; kafka 的高可用机制是什么? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Apache Kafka 是一个分布式消息系统&am…

【AI学习】Mamba学习(十二):深入理解S4模型

#1024程序员节|征文# HiPPO的学习暂告一段落,按照“HiPPO->S4->Mamba 演化历程”,接着学习S4。 S4对应的论文:《Efficiently Modeling Long Sequences with Structured State Spaces》 文章链接:https://ar5iv…

【移动应用开发】界面设计(二)实现水果列表页面

续上一篇博客 【移动应用开发】界面设计(一)实现登录页面-CSDN博客 目录 一、采用ViewBinding实现一个RecyclerView 1.1 在app/build.gradle中添加recyclerview依赖,并打开viewBinding (1)在app/build.gradle中添加…

CORS预检请求配置流程图 srpingboot和uniapp

首先要会判断预检请求 还是简单请求 简单请求 预检请求 #mermaid-svg-1R9nYRa7P9Pll4AK {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-1R9nYRa7P9Pll4AK .error-icon{fill:#552222;}#mermaid-svg-1R9nYRa7P9Pll4…

智能园艺:Spring Boot植物健康系统

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所,二十一世纪是信息的时代,所以信息的管理显得特别重要。因此,使用计算机来管理植物健康系统的相关信息成为必然。开发合适…

51单片机——OLED显示图片

取模软件:链接:https://pan.baidu.com/s/1UcrbS7nU4bsawNxsaaULfQ 提取码:gclc 1、如果图片大小和格式不合适,可以先用Img2Lcd软件进行调整图片大小,一般取模软件使用的是.bmp图片,可以进行输出.bmp格式。软件界面如下&#xff1…

开源vGPU方案 HAMi实现细粒度GPU切分——筑梦之路

前言 为什么需要 GPU 共享、切分等方案? 在使用GPU的过程中我们会发现,直接在裸机环境使用,都可以多个进程共享 GPU,怎么到 k8s 环境就不行了? 1. 资源感知 在 k8s 中资源是和节点绑定的,对于 GPU 资源…

打包方式-jar和war的区别

1、jar包 JAR包是类的归档文件,与平台无关的文件格式,其实jar包就是java的类进行编译生成的class文件进行打包的压缩包。 JAR以ZIP文件格式为基础,与ZIP不同的是,JAR不仅用于压缩和发布,还用于部署和封装库、组件和插…

R实验——logistic回归、LDA、QDAKNN

数据集介绍: mpg,miles per gallon即油耗,这个数据集来自卡内基梅隆大学维护的StatLib库。1983年美国统计协会博览会使用了该数据集。这个数据集是对StatLib库中提供的数据集稍加修改的版本。根据Ross Quinlan(1993)在预测属性“mpg”中的使…

利用飞腾派进行OpenCV开发

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

vue3 选中对话框时,对话框右侧出一个箭头

先看下做出的效果&#xff1a; html代码&#xff0c;其中listPlan.records是后台拿到的数据进行遍历 <template><ul class"list"><li style"height: 180px;width: 95%":key"index"v-for"(item, index) in listPlan.record…

Android 判断手机放置的方向

#1024程序员节&#xff5c;征文# 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 需求 老板&#xff1a;我有个手持终端&#xff0c;不能让他倒了&#xff0c;当他倒或者倾斜的时候要发出报警&#xff1b; 程序猿&#xff1a;我这..... 老板…

Servlet(三)-------Cookie和session

一.Cookie和Session Cookie和Session都是用于在Web应用中跟踪用户状态的技术。Cookie是存储在用户浏览器中的小文本文件&#xff0c;由服务器发送给浏览器。当用户再次访问同一网站时&#xff0c;浏览器会把Cookie信息发送回服务器。例如&#xff0c;网站可以利用Cookie记住用…

Python与MySQL

一、Python 操作 MySQL 数据库软件 我们在上一篇文章《SQL入门》中使用了图形化工具DBeaver操作MySQL数据库软件&#xff0c;除了使用图形化工具以外&#xff0c;我们也可以使用编程语言来执行 SQL 从而操作数据库&#xff0c;可以在 Python 中&#xff0c;使用第三方库 pymys…

设计师的新宠:7款不容错过的界面设计软件

在UI设计领域&#xff0c;设计师们常常需要借助各种工具来实现他们的创意。市场上众多的设计软件让设计师们有了丰富的选择&#xff0c;但同时也带来了选择困难。一个好的软件界面设计工具不仅能提升工作效率&#xff0c;还能为设计师提供丰富的资源和参考&#xff0c;帮助他们…

Python:背景知识及环境安装

一、计算机的基础概念 1.1 什么是计算机&#xff1f; 最早我们有计算器&#xff0c;但是他只能完成算数运算的功能 而计算机能完成的工作有&#xff1a; &#xff08;1&#xff09;算术运算 &#xff08;2&#xff09;逻辑判断 &#xff08;3&#xff09;数据存储 &#xff08…

使用AutoDL训练YOLO等计算机视觉网络模型(AutoDL+Xftp+VS Code),附详细操作步骤

前言 本文记录利用AutoDL云服务器&#xff0c;使用VS Code远程连接进行模型训练&#xff0c;步骤完整&#xff0c;操作简便&#xff0c;不需要使用任何命令即可快速运行&#x1f680;。 专栏目录&#xff1a;YOLOv11改进目录一览 | 涉及卷积层、轻量化、注意力、损失函数、Bac…