python教程8-页面爬虫

python · 浏览次数 : 0

小编点评

**使用 requests 和 BeautifulSoup 爬取豆瓣评论** ```python import re import requests from bs4 import BeautifulSoup # 设置请求参数 headers = { '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', } # 获取页面数据 response = requests.get('https://www.douban.com/group/topic/102346598/?_i=5308140i1GN13-', headers=headers) # 解析页面 page_obj = BeautifulSoup(response.text, "lxml") # 找到所有评论 div reply_divs = page_obj.find_all("div", attrs={"class": "reply-doc"}) # 解析评论数据 mail_list = [] 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"}) mail_list.append([mail_re.group(), pub_time.text]) # 打印邮件列表 print(mail_list) ``` **注意:** * 此代码需要先安装 `requests` 和 `BeautifulSoup`。可以使用 `pip install requests beautifulsoup4` 命令进行安装。 * 该代码假设豆瓣评论的页面结构一致,即所有评论都包含 `p` 元素的 `span` 元素包含邮件地址。 * 该代码仅展示了获取评论数据的部分流程,您可以根据需要进行扩展。

正文

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教程8-页面爬虫

python爬虫常用requests和beautifulSoup这2个第三方模块。需要先进行手动安装。 requests负责下载页面数据,beautifulSoup负责解析页面标签。 关于beautifulSoup的api使用,详见api页面:https://beautifulsoup.readth

Python openpyxl使用教程

1.安装 openpyxl 组件 pip install openpyxl -i https://mirrors.aliyun.com/pypi/simple/ 新建Excel # coding=utf-8 from openpyxl import Workbook wb = Workbook()

Python OpenCV #1 - OpenCV介绍

一、OpenCV介绍 1.1 OpenCV-Python教程简介 OpenCV由 Gary Bradsky 于1999年在英特尔创立,第一个版本于2000年发布。 Vadim Pisarevsky 加入了Gary Bradsky,管理英特尔的俄罗斯软件OpenCV团队。2005年,OpenCV被用于

【Playwright+Python】系列教程(五)元素定位

一、常见元素定位 定位器是 Playwright 自动等待和重试能力的核心部分。简而言之,定位器代表了一种随时在页面上查找元素的方法,以下是常用的内置定位器。 1、按角色定位 按显式和隐式可访问性属性进行定位 语法:page.get_by_role() Dom结构示例1: 示例代码1: page.g

【Playwright+Python】系列教程(四)Pytest 插件在Playwright中的使用

一、命令行使用详解 使用Pytest插件在Playwright 中来编写端到端的测试。 1、命令行执行测试 pytest --browser webkit --headed 2、使用 pytest.ini 文件配置 内容如下: [pytest] # Run firefox with UI addop

【Playwright+Python】系列教程(二)手把手带你写一个脚本

一、如何使用代理方式打开网页 在 playwright.chromium.launch() 中传入 proxy 参数即可,示例代码如下: 1、同步写法: from playwright.sync_api import sync_playwright proxy = {'server': 'http:

【Playwright+Python】系列教程(一)环境搭建及脚本录制

一、前言 看到这个文章,有的同学会说: 六哥,你为啥不早早就写完python系列的文章。 因为有徒弟需要吧,如果你也想学自学,那这篇文章,可以说是我们结缘一起学习的开始吧! 如果对你有用,建议收藏和转发! 二、Playwright是什么? 微软开源自动化测试工具Playwright,支持主流浏览器,

躬身入局,干货分享,2023年春招后端技术岗(Python)面试实战教程,Offer今始为君发

早春二月,研发倍忙,杂花生树,群鸥竟飞。为什么?因为春季招聘,无论是应届生,还是职场老鸟,都在摩拳擦掌,秣马厉兵,准备在面试场上一较身手,既分高下,也决Offer,本次我们打响春招第一炮,躬身入局,让2023年的第一个Offer来的比以往快那么一点点。

全网最适合入门的面向对象编程教程:20 类和对象的 Python 实现-组合关系的实现与 CSV 文件保存

本文主要介绍了在使用Python面向对象编程时,如何实现组合关系,同时对比了组合关系和继承关系的优缺点,并讲解了如何通过csv模块来保存Python接收/生成的数据。

全网最适合入门的面向对象编程教程:18 类和对象的 Python 实现-多重继承与 PyQtGraph 串口数据绘制曲线图

本文主要介绍了Python中创建自定义类时如何使用多重继承、菱形继承的概念和易错点,同时讲解了如何使用PyQtGraph库对串口接收的数据进行绘图。