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-页面爬虫的更多相关文章

  1. Python 自用代码(scrapy多级页面(三级页面)爬虫)

    2017-03-28 入职接到的第一个小任务,scrapy多级页面爬虫,从来没写过爬虫,也没学过scrapy,甚至连xpath都没用过,最后用了将近一周才搞定.肯定有很多low爆的地方,希望大家可以给 ...

  2. python利用beautifulsoup多页面爬虫

    利用了beautifulsoup进行爬虫,解析网址分页面爬虫并存入文本文档: 结果: 源码: from bs4 import BeautifulSoup from urllib.request imp ...

  3. Python初学者之网络爬虫(二)

    声明:本文内容和涉及到的代码仅限于个人学习,任何人不得作为商业用途.转载请附上此文章地址 本篇文章Python初学者之网络爬虫的继续,最新代码已提交到https://github.com/octans ...

  4. 洗礼灵魂,修炼python(69)--爬虫篇—番外篇之feedparser模块

    feedparser模块 1.简介 feedparser是一个Python的Feed解析库,可以处理RSS ,CDF,Atom .使用它我们可从任何 RSS 或 Atom 订阅源得到标题.链接和文章的 ...

  5. 洗礼灵魂,修炼python(50)--爬虫篇—基础认识

    爬虫 1.什么是爬虫 爬虫就是昆虫一类的其中一个爬行物种,擅长爬行. 哈哈,开玩笑,在编程里,爬虫其实全名叫网络爬虫,网络爬虫,又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者 ...

  6. python接口自动化28-requests-html爬虫框架

    前言 requests库的好,只有用过的人才知道,最近这个库的作者又出了一个好用的爬虫框架requests-html.之前解析html页面用过了lxml和bs4, requests-html集成了一些 ...

  7. 使用Python + Selenium打造浏览器爬虫

    Selenium 是一款强大的基于浏览器的开源自动化测试工具,最初由 Jason Huggins 于 2004 年在 ThoughtWorks 发起,它提供了一套简单易用的 API,模拟浏览器的各种操 ...

  8. Python 利用Python编写简单网络爬虫实例3

    利用Python编写简单网络爬虫实例3 by:授客 QQ:1033553122 实验环境 python版本:3.3.5(2.7下报错 实验目的 获取目标网站“http://bbs.51testing. ...

  9. Python 利用Python编写简单网络爬虫实例2

    利用Python编写简单网络爬虫实例2 by:授客 QQ:1033553122 实验环境 python版本:3.3.5(2.7下报错 实验目的 获取目标网站“http://www.51testing. ...

  10. 简明Python教程自学笔记——命令行通讯录

    [前言]学习Python已经有一段时间了,相关的书籍资料也下载了不少,但是没有一本完整的看完,也没有编出一个完整的程序.今天下午比较清闲就把<简明Python教程>看了一遍,然后根据书里面 ...

随机推荐

  1. Scala 函数闭包和柯里化

    1 package com.atguigu.function 2 3 object HighFunction { 4 def main(args: Array[String]): Unit = { 5 ...

  2. #Kruskal,可撤销并查集#CF891C Envy

    题目 给出一个 \(n\) 个点 \(m\) 条边的无向图,每条边有边权,共 \(Q\) 次询问, 每次给出 \(k_i\) 条边,问这些边能否同时在一棵最小生成树上. 分析 考虑最小生成树选择的边权 ...

  3. OpenHarmony 3.1 Release版本关键特性解析——HDI硬件设备接口介绍

    HDF 驱动框架是 OpenAtom OpenHarmony(简称"OpenHarmony")系统硬件生态开放的基础,为驱动开发者提供了驱动加载.驱动服务管理和驱动消息机制等驱动框 ...

  4. climits 与 符号常量

    climits  在老式中是 limits.h 一.引入 #include <climits> 或者 #include <limits.h> 二.符号常量 符号常量 表示 CH ...

  5. openGauss/MogDB配置IPv6

    openGauss/MogDB 配置 IPv6 openGauss/MogDB 支持多种网络接口,假如我们想在支持 IPv6 的网络上部署使用,只需简单操作即可,本文将介绍在 Centos 上如何配置 ...

  6. keycloak~RequiredActionProvider的使用

    使用场景 RequiredActionProvider,它是在认证过程中,需要当前登录的用户执行个性化的动作:当用户符合条件,就被执行RequiredActionProvider对作,当Require ...

  7. 树模型-label boosting-GBDT

    GBDT GBDT是boosting系列算法的代表之一,其核心是 梯度+提升+决策树. GBDT回归问题 通俗的理解: 先来个通俗理解:假如有个人30岁,我们首先用20岁去拟合,发现损失有10岁,这时 ...

  8. centos7.2 利用yum安装配置apache2.4多虚拟主机

    centos7.2 利用yum安装配置apache2.4多虚拟主机 标签: centosapacheyum 2017-01-10 21:01  3175人阅读  评论(0)  收藏  举报   分类: ...

  9. vue项目node-scss装不上问题( vue执行npm install报错: Can‘t find Python executable “python“, you can set the PYTHON env variable

    一.描述从网上下载的一个Vue模板项目,导入VsCode,执行npm install命令后,报错了,报错的信息是node-sass安装失败,同时提示需要python环境的错误信息,这是因为安装node ...

  10. 牛客网-SQL专项训练14

    ①通过子查询的方式从衬衫表SHIRTABLE中选取出销售单价shirt_price高于全部衬衫的平均价格的衬衫名字:B 解析: 题目要求需要用到子查询,故排除AC选项,而D选项在where子句中使用了 ...