首页 > 编程语言 >python教程8-页面爬虫

python教程8-页面爬虫

时间:2024-05-10 10:57:04浏览次数:31  
标签:教程 obj python list 爬虫 re mail div page

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)

 

标签:教程,obj,python,list,爬虫,re,mail,div,page
From: https://www.cnblogs.com/tiandi/p/18183814

相关文章

  • 微信电脑文件清理python程序
    importos,refromitertoolsimportcombinations#两两组合defcombinations_iterative(elements):returnlist(combinations(elements,2))#将按照字符串长度升序排列defsort_by_length(lst):#定义一个自定义排序函数,按字符串长度排序deflength_sort(it......
  • 详解Python 中可视化数据分析工作流程
    本文分享自华为云社区《Python可视化数据分析从数据获取到洞见发现的全面指南》,作者:柠檬味拥抱。在数据科学和分析的领域中,可视化是一种强大的工具,能够帮助我们理解数据、发现模式,并得出洞见。Python提供了丰富的库和工具,使得可视化数据分析工作流程变得高效而灵活。本文将介绍......
  • Python进阶之面向对象编程
    【一】人狗大战小游戏【1】游戏前提分析人可以打狗,狗掉血,狗可以咬人,人掉血人的属性有名字、年龄、伤害、血量、类型狗的属性有名字、年龄、伤害、血量、类型【2】游戏实现(1)定义人和狗的属性#【1】用字典定义,代码较冗余dog1={'name':'狗蛋','d_type':'中......
  • python 基础习题 for循环
    1.用for循环打印出从1到10的所有整数,输出如下:12345678910  2.  声明如下变量:aString='Python'..........#请补齐以上省略号处的for循环语句,使得输出结果是:当前字母:P当前字母:y当前字母:t当前字母:h当前字母:o当前字母:n 最好用两种方法,一个使用不......
  • ROS话题通讯编写发布者(publisher)与订阅者(subscriber) Python
    学习参考:ROS/Tutorials/WritingPublisherSubscriber(python)-ROSWiki本文主要为了加强学习记忆,不是供人参考学习,如果想要学习点击链接系统学习; 在自己创建的工作空间下的src目录下创建一个新的功能包,在功能包中创建scripts文件夹,在内部放置.py源码; 下面剖析发布者源码......
  • 学习python步骤
    参考链接:https://zhuanlan.zhihu.com/p/693208513一、Python基础学习Python语言基础的路线可以分为以下几个阶段:Python3入门:了解Python3的安装方法、如何运行Python程序以及交互模式的使用,同时学习注释的添加方法。数据类型:掌握Python中的各种数据类型,包括数字、布尔值、......
  • PyCharm编辑器结合Black插件,轻松实现Python代码格式化
    1、简介使用Black对Python代码进行格式化,可使代码看起来更美观。但是,随着项目规模不断变大,对每个文件运行Black变得很繁琐。能否在文件保存后立即运行Black呢?本文就来介绍在PyCharm中实现这一目标的方法。2、安装Black首先,在虚拟环境中安装Black。$pipinstallblack ......
  • python教程6.6-发送邮件smtplib
    实现步骤: Python对SMTP⽀持有smtplib和email两个模块,email负责构造邮件,smtplib负责发送邮件,它对smtp协议进⾏了简单的封装。简单代码示例:发送html格式的邮件:在html中插入图片: ......
  • python学习----谁在说谎逻辑运算
    if__name__=='__main__':Li=[0,1]forainLi:forbinLi:forcinLi:zhang=(b==0)li=(c==0)wang=(a+b==0)if(zhang+li+wang==2anda+b+c=......
  • ubuntu22 python2 pyinstaller 打包报错:'NoneType' object has no attribute 'groups'
    前言最近有个需求,需要在ubnutu22上使用pyinstaller打包一个python2的文件。中间遇到了一些问题:pip2installpyinstaller报错解决方案:pip2installpyinstaller==3.6python2和python3的pyinstaller如何同时存在,我想把python2的pyinstaller命名为pyin......