python教程8-页面爬虫
python爬虫常用requests和beautifulSoup这2个第三方模块。需要先进行手动安装。
requests负责下载页面数据,beautifulSoup负责解析页面标签。
关于beautifulSoup的api使用,详见api页面:https://beautifulsoup.readthedocs.io/zh-cn/v4.4.0/#find-all
豆瓣评论中邮箱数据爬取案例:
import re #正则表达式
import requests #下载网页
import bs4# beautifulSoup,解析网页 headers1={
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Cache-Control': 'max-age=0',
'Connection': 'keep-alive',
'Host': 'www.douban.com',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36'
} mail_list=[] #list存储邮箱结果
#因为豆瓣有反爬取机制,因此requests需要添加headers来模拟浏览器,否则requests抓取不到页面
response = requests.get('https://www.douban.com/group/topic/102346598/?_i=5308140i1GN13-',headers=headers1)
#print(response.text) #页面文本按lxml格式进行解析
page_obj = bs4.BeautifulSoup(response.text,"lxml")
reply_divs=page_obj.find_all("div",attrs={"class":"reply-doc"})#找到所有的评论div
#print(len(reply_divs)) if reply_divs:
for div in reply_divs:#遍历div,对评论数据进行解析
reply_div=div.find_next("p",attrs={"class":"reply-content"})
mail_re=re.search("\w+@\w+.\w+",reply_div.text,flags=re.A)#用正则表达式匹配邮箱,#flags=re.A的作用是排除2侧的中文
if mail_re:#如果这个评论中有邮箱,则继续查找他的时间
times=div.find_next("span",attrs={"class":"pubtime"})
mail_list.append([mail_re.group(),times.text]) print(mail_list)
print(len(mail_list))
在豆瓣评论中有分页的情况,如果要分页评论数据都抓取要改造如下:
import re #正则表达式
import requests #下载网页
import bs4# beautifulSoup,解析网页 headers1={
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Cache-Control': 'max-age=0',
'Connection': 'keep-alive',
'Host': 'www.douban.com',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36'
} def download_page(url1):
#先抓取第一页数据
print(f"下载分页{url1}")
response = requests.get(url1, headers=headers1)
page_obj = bs4.BeautifulSoup(response.text, "lxml")
bs4_page_obj_list = [page_obj] #把第一页数据存储下来 # 把所有的分页下载下来后,然后统一去提取emails
url_set = set() # 存下所有的分页的url
paginator_ele = page_obj.find("div", attrs={"class": "paginator"})
for a_ele in paginator_ele.find_all("a"):
url_set.add(a_ele.attrs.get("href")) for url in url_set:#变量其他分页(除了第一页)
print(f"下载分页{url}")
page_obj = requests.get(url, headers=headers1)
bs4_page_obj = bs4.BeautifulSoup(page_obj.text, "lxml")
bs4_page_obj_list.append(bs4_page_obj) # 先暂存 return bs4_page_obj_list def fetch_emails(page_obj_list):
mail_list=[]
for bs4_obj in page_obj_list:# 循环每个页面
reply_divs = bs4_obj.find_all("div",attrs={"class":"reply-doc"})
for div in reply_divs:
reply_div = div.find("p",attrs={"class":"reply-content"})
mail_re = re.search("\w+@\w+\w+",reply_div.text,flags=re.A)
if mail_re:
pub_time = div.find("span",attrs={'class':"pubtime"})
print(pub_time.text,mail_re.group())
mail_list.append([mail_re.group(),pub_time.text]) print(f'总共有邮箱数量是:{len(mail_list)}') all_bs4_page_list = download_page("https://www.douban.com/group/topic/102346598/?_i=5308140i1GN13-")
fetch_emails(all_bs4_page_list)
python教程8-页面爬虫的更多相关文章
- Python 自用代码(scrapy多级页面(三级页面)爬虫)
2017-03-28 入职接到的第一个小任务,scrapy多级页面爬虫,从来没写过爬虫,也没学过scrapy,甚至连xpath都没用过,最后用了将近一周才搞定.肯定有很多low爆的地方,希望大家可以给 ...
- python利用beautifulsoup多页面爬虫
利用了beautifulsoup进行爬虫,解析网址分页面爬虫并存入文本文档: 结果: 源码: from bs4 import BeautifulSoup from urllib.request imp ...
- Python初学者之网络爬虫(二)
声明:本文内容和涉及到的代码仅限于个人学习,任何人不得作为商业用途.转载请附上此文章地址 本篇文章Python初学者之网络爬虫的继续,最新代码已提交到https://github.com/octans ...
- 洗礼灵魂,修炼python(69)--爬虫篇—番外篇之feedparser模块
feedparser模块 1.简介 feedparser是一个Python的Feed解析库,可以处理RSS ,CDF,Atom .使用它我们可从任何 RSS 或 Atom 订阅源得到标题.链接和文章的 ...
- 洗礼灵魂,修炼python(50)--爬虫篇—基础认识
爬虫 1.什么是爬虫 爬虫就是昆虫一类的其中一个爬行物种,擅长爬行. 哈哈,开玩笑,在编程里,爬虫其实全名叫网络爬虫,网络爬虫,又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者 ...
- python接口自动化28-requests-html爬虫框架
前言 requests库的好,只有用过的人才知道,最近这个库的作者又出了一个好用的爬虫框架requests-html.之前解析html页面用过了lxml和bs4, requests-html集成了一些 ...
- 使用Python + Selenium打造浏览器爬虫
Selenium 是一款强大的基于浏览器的开源自动化测试工具,最初由 Jason Huggins 于 2004 年在 ThoughtWorks 发起,它提供了一套简单易用的 API,模拟浏览器的各种操 ...
- Python 利用Python编写简单网络爬虫实例3
利用Python编写简单网络爬虫实例3 by:授客 QQ:1033553122 实验环境 python版本:3.3.5(2.7下报错 实验目的 获取目标网站“http://bbs.51testing. ...
- Python 利用Python编写简单网络爬虫实例2
利用Python编写简单网络爬虫实例2 by:授客 QQ:1033553122 实验环境 python版本:3.3.5(2.7下报错 实验目的 获取目标网站“http://www.51testing. ...
- 简明Python教程自学笔记——命令行通讯录
[前言]学习Python已经有一段时间了,相关的书籍资料也下载了不少,但是没有一本完整的看完,也没有编出一个完整的程序.今天下午比较清闲就把<简明Python教程>看了一遍,然后根据书里面 ...
随机推荐
- 突然连不上Github或者连接超时的解决办法
问题描述当进行仓库pull或者push时,报错如下(连接失败/被拒绝/超时等): Failed to connect to github.com port 443: Connection refuse ...
- #BFS,二进制#CF1776J Italian Data Centers
洛谷题面 CF1776J 分析 将原图的点所拆开的点按二进制编号,那么同一个点之间连边当且仅当恰好一个二进制位不同, 不同点之间连边颜色相同则其二进制相同,否则完全相反. 可以钦定起点就是 \((x, ...
- #根号分治,前缀和,双指针#CF1446D2 Frequency Problem (Hard Version)
题目 给定一个长度为 \(n\) 的序列,问是否存在一个最长的区间使得至少存在两个众数. 分析 实际上 Easy Version 是用来启发大于根号的做法的. 众数可以说有一个性质吧,答案区间中的其中 ...
- #KM算法#UVA11383 Golden Tiger Claw
题目 给定 \(n*n\) 的矩阵,现在给每行安排一个权值 \(x_i\),给每列安排一个权值 \(y_j\), 使得 \(x_i+y_j\geq a_{i,j}\),并且使 \(\sum_{i=1} ...
- #贪心#CF605A Sorting Railway Cars
题目 一个长度为 \(n\) 的排列,每次可以将一个数移至开头或者结尾,问最少多少次使其升序排列 分析 让数字连续的情况尽量多才能让移出来的次数尽量少, 找到最长的数字连续段,若其长度为 \(len\ ...
- 全面指南:技术写作与编辑工具 Markdown、Git 研究工具
技术写作工具 在技术写作领域,"工具"是指技术写作者用于创建.管理和发布高质量技术文档的各种软件和应用程序.这包括文字处理器.桌面出版应用程序.XML 编辑器.内容管理系统等等.一 ...
- 深入理解MD5算法:原理、应用与安全
第一章:引言 导言 在当今数字化时代,数据安全和完整性变得至关重要.消息摘要算法是一种用于验证数据完整性和安全性的重要工具.在众多消息摘要算法中,MD5(Message Digest Algorith ...
- HarmonyOS传感器开发指南
HarmonyOS系统传感器是应用访问底层硬件传感器的一种设备抽象概念.开发者根据传感器提供的Sensor接口,可以查询设备上的传感器,订阅传感器数据,并根据传感器数据定制相应的算法开发各类应用, ...
- 喜报|HarmonyOS开发者社区连获业内奖项,持续深耕开发者生态
临近年末,各大平台陆续揭晓年度榜单,表彰了具备强大影响力与做出突出贡献的优秀项目与团队,而HarmonyOS开发者社区作为技术分享,学习和展示的平台,输出高质量技术文章百余篇,连续获得业内各大奖项, ...
- cesiumjs GIS引擎源码编译并运行-2021年3月18日最新版【1.68~1.79.1版本亲测成功】
前言 本篇最初是在2020年的[macOS Big Sur + Cesium 1.76版本]下编译成功,后在[macOS Catalina+cesium 1.79.1版本]编译过程中,出现编译的错误和 ...