热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

爬虫(七十六)用urllib和re爬取百度贴吧

这篇文章我们将使用urllib和re模块爬取百度贴吧,并使用三种文件格式存储数据,下面先贴上最终的效果图1、网页分析(1)准

这篇文章我们将使用 urllib 和 re 模块爬取百度贴吧,并使用三种文件格式存储数据,下面先贴上最终的效果图

1、网页分析

(1)准备工作

首先我们使用 Chrome 浏览器打开 百度贴吧,在输入栏中输入关键字进行搜索,这里示例为 “计算机吧”

2)分析 URL 规律

接下来我们开始分析网站的 URL 规律,以便于通过构造 URL 获取网站中所有网页的内容

第一页:

http://tieba.baidu.com/f?kw=%E8%AE%A1%E7%AE%97%E6%9C%BA&ie=utf-8&pn=0


第二页:

http://tieba.baidu.com/f?kw=%E8%AE%A1%E7%AE%97%E6%9C%BA&ie=utf-8&pn=50


第三页:

http://tieba.baidu.com/f?kw=%E8%AE%A1%E7%AE%97%E6%9C%BA&ie=utf-8&pn=100
...

通过观察不难发现,它的 URL 十分有规律,主要的请求参数分析如下:

kw:搜索的关键字,使用 URL 编码,可以通过 urllib.parse.quote() 方法实现

ie:字符编码的格式,其值为 utf-8

pn:当前页面的页码,并且以 50 为步幅增长

所以完整的 URL 可以泛化如下:

http://tieba.baidu.com/f?kw={keyword}&ie=utf-8&pn={page}

核心代码如下:

import urllib.request
import urllib.parse
# 获取网页源代码
def get_page(url):# 构造请求头部headers = {'USER-AGENT':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'}# 构造请求对象req = urllib.request.Request(url=url,headers=headers)# 发送请求,得到响应response = urllib.request.urlopen(req)# 获得网页源代码html = response.read().decode('utf-8')# 返回网页源代码return html

(3)分析内容规律

接下来我们直接使用快捷键 Ctrl+U 打开网页的源代码,认真分析每一页中我们需要抓取的数据

容易发现每一个帖子的内容都被包含在一个

  • 标签中,我们可以使用正则表达式进行匹配,具体包括:

    主题名称:r'href="/p/\d+" title="(.+?)"'

    主题作者:r'title="主题作者: (.+?)"'

    链接地址:r'href="/p/(\d+)"'

    回复数&#xff1a;r&#39;title&#61;"回复">(\d&#43;)<&#39;

    创建日期&#xff1a;r&#39;title&#61;"创建时间">(.&#43;?)<&#39;

    核心代码如下&#xff1a;

    import re
    # 解析网页源代码&#xff0c;提取数据
    def parse_page(html):# 主题名称titles &#61; re.findall(r&#39;href&#61;"/p/\d&#43;" title&#61;"(.&#43;?)"&#39;,html)# 主题作者authods &#61; re.findall(r&#39;title&#61;"主题作者: (.&#43;?)"&#39;,html)# 链接地址nums &#61; re.findall(r&#39;href&#61;"/p/(\d&#43;)"&#39;,html)links &#61; [&#39;http://tieba.baidu.com/p/&#39;&#43;str(num) for num in nums]# 回复数量focus &#61; re.findall(r&#39;title&#61;"回复">(\d&#43;)&#39;,html)# 创建时间ctimes &#61; re.findall(r&#39;title&#61;"创建时间">(.&#43;?)<&#39;,html)# 获得结果data &#61; zip(titles,authods,links,focus,ctimes)# 返回结果return data

    &#xff08;4&#xff09;保存数据

    下面将数据保存为 txt 文件、json 文件和 csv 文件

    import json
    import csv
    # 打开文件
    def openfile(fm,fileName):fd &#61; Noneif fm &#61;&#61; &#39;txt&#39;:fd &#61; open(fileName&#43;&#39;.txt&#39;,&#39;w&#39;,encoding&#61;&#39;utf-8&#39;)elif fm &#61;&#61; &#39;json&#39;:fd &#61; open(fileName&#43;&#39;.json&#39;,&#39;w&#39;,encoding&#61;&#39;utf-8&#39;)elif fm &#61;&#61; &#39;csv&#39;:fd &#61; open(fileName&#43;&#39;.csv&#39;,&#39;w&#39;,encoding&#61;&#39;utf-8&#39;,newline&#61;&#39;&#39;)return fd# 将数据保存到文件
    def save2file(fm,fd,data):if fm &#61;&#61; &#39;txt&#39;:for item in data:fd.write(&#39;----------------------------------------\n&#39;)fd.write(&#39;title&#xff1a;&#39; &#43; str(item[0]) &#43; &#39;\n&#39;)fd.write(&#39;authod&#xff1a;&#39; &#43; str(item[1]) &#43; &#39;\n&#39;)fd.write(&#39;link&#xff1a;&#39; &#43; str(item[2]) &#43; &#39;\n&#39;)fd.write(&#39;focus&#xff1a;&#39; &#43; str(item[3]) &#43; &#39;\n&#39;)fd.write(&#39;ctime&#xff1a;&#39; &#43; str(item[4]) &#43; &#39;\n&#39;)if fm &#61;&#61; &#39;json&#39;:temp &#61; (&#39;title&#39;,&#39;authod&#39;,&#39;link&#39;,&#39;focus&#39;,&#39;ctime&#39;)for item in data:json.dump(dict(zip(temp,item)),fd,ensure_ascii&#61;False)if fm &#61;&#61; &#39;csv&#39;:writer &#61; csv.writer(fd)for item in data:writer.writerow(item)

    2、编码实现

    完整代码如下&#xff0c;也很简单&#xff0c;还不到 100 行

    import urllib.request
    import urllib.parse
    import re
    import json
    import csv
    import time
    import random# 获取网页源代码
    def get_page(url):headers &#61; {&#39;USER-AGENT&#39;:&#39;Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36&#39;}req &#61; urllib.request.Request(url&#61;url,headers&#61;headers)response &#61; urllib.request.urlopen(req)html &#61; response.read().decode(&#39;utf-8&#39;)return html# 解析网页源代码&#xff0c;提取数据
    def parse_page(html):titles &#61; re.findall(r&#39;href&#61;"/p/\d&#43;" title&#61;"(.&#43;?)"&#39;,html)authods &#61; re.findall(r&#39;title&#61;"主题作者: (.&#43;?)"&#39;,html)nums &#61; re.findall(r&#39;href&#61;"/p/(\d&#43;)"&#39;,html)links &#61; [&#39;http://tieba.baidu.com/p/&#39;&#43;str(num) for num in nums]focus &#61; re.findall(r&#39;title&#61;"回复">(\d&#43;)&#39;,html)ctimes &#61; re.findall(r&#39;title&#61;"创建时间">(.&#43;?)<&#39;,html)data &#61; zip(titles,authods,links,focus,ctimes)return data# 打开文件
    def openfile(fm,fileName):if fm &#61;&#61; &#39;txt&#39;:return open(fileName&#43;&#39;.txt&#39;,&#39;w&#39;,encoding&#61;&#39;utf-8&#39;)elif fm &#61;&#61; &#39;json&#39;:return open(fileName&#43;&#39;.json&#39;,&#39;w&#39;,encoding&#61;&#39;utf-8&#39;)elif fm &#61;&#61; &#39;csv&#39;:return open(fileName&#43;&#39;.csv&#39;,&#39;w&#39;,encoding&#61;&#39;utf-8&#39;,newline&#61;&#39;&#39;)else:return None# 将数据保存到文件
    def save2file(fm,fd,data):if fm &#61;&#61; &#39;txt&#39;:for item in data:fd.write(&#39;----------------------------------------\n&#39;)fd.write(&#39;title&#xff1a;&#39; &#43; str(item[0]) &#43; &#39;\n&#39;)fd.write(&#39;authod&#xff1a;&#39; &#43; str(item[1]) &#43; &#39;\n&#39;)fd.write(&#39;link&#xff1a;&#39; &#43; str(item[2]) &#43; &#39;\n&#39;)fd.write(&#39;focus&#xff1a;&#39; &#43; str(item[3]) &#43; &#39;\n&#39;)fd.write(&#39;ctime&#xff1a;&#39; &#43; str(item[4]) &#43; &#39;\n&#39;)if fm &#61;&#61; &#39;json&#39;:temp &#61; (&#39;title&#39;,&#39;authod&#39;,&#39;link&#39;,&#39;focus&#39;,&#39;ctime&#39;)for item in data:json.dump(dict(zip(temp,item)),fd,ensure_ascii&#61;False)if fm &#61;&#61; &#39;csv&#39;:writer &#61; csv.writer(fd)for item in data:writer.writerow(item)# 开始爬取网页
    def crawl():kw &#61; input(&#39;请输入主题贴吧名字&#xff1a;&#39;)base_url &#61; &#39;http://tieba.baidu.com/f?kw&#61;&#39; &#43; urllib.parse.quote(kw) &#43; &#39;&ie&#61;utf-8&pn&#61;{page}&#39;fm &#61; input(&#39;请输入文件保存格式&#xff08;txt、json、csv&#xff09;&#xff1a;&#39;)while fm!&#61;&#39;txt&#39; and fm!&#61;&#39;json&#39; and fm!&#61;&#39;csv&#39;:fm &#61; input(&#39;输入错误&#xff0c;请重新输入文件保存格式&#xff08;txt、json、csv&#xff09;&#xff1a;&#39;)fd &#61; openfile(fm,kw)page &#61; 0total_page &#61; int(re.findall(r&#39;共有主题数(\d&#43;)个&#39;,get_page(base_url.format(page&#61;str(0))))[0])print(&#39;开始爬取&#39;)while page

    请继续关注我

    记得点赞加关注哦&#xff0c;记得加鸡腿啊


  • 推荐阅读
    • 使用正则表达式爬取36Kr网站首页新闻的操作步骤和代码示例
      本文介绍了使用正则表达式来爬取36Kr网站首页所有新闻的操作步骤和代码示例。通过访问网站、查找关键词、编写代码等步骤,可以获取到网站首页的新闻数据。代码示例使用Python编写,并使用正则表达式来提取所需的数据。详细的操作步骤和代码示例可以参考本文内容。 ... [详细]
    • 如何自行分析定位SAP BSP错误
      The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
    • 分享css中提升优先级属性!important的用法总结
      web前端|css教程css!importantweb前端-css教程本文分享css中提升优先级属性!important的用法总结微信门店展示源码,vscode如何管理站点,ubu ... [详细]
    • 超级简单加解密工具的方案和功能
      本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
    • Python实现变声器功能(萝莉音御姐音)的方法及步骤
      本文介绍了使用Python实现变声器功能(萝莉音御姐音)的方法及步骤。首先登录百度AL开发平台,选择语音合成,创建应用并填写应用信息,获取Appid、API Key和Secret Key。然后安装pythonsdk,可以通过pip install baidu-aip或python setup.py install进行安装。最后,书写代码实现变声器功能,使用AipSpeech库进行语音合成,可以设置音量等参数。 ... [详细]
    • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
    • android listview OnItemClickListener失效原因
      最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
    • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
    • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
    • Python瓦片图下载、合并、绘图、标记的代码示例
      本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
    • 树莓派语音控制的配置方法和步骤
      本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
    • 本文介绍了一种在PHP中对二维数组根据某个字段进行排序的方法,以年龄字段为例,按照倒序的方式进行排序,并给出了具体的代码实现。 ... [详细]
    • 如何在php文件中添加图片?
      本文详细解答了如何在php文件中添加图片的问题,包括插入图片的代码、使用PHPword在载入模板中插入图片的方法,以及使用gd库生成不同类型的图像文件的示例。同时还介绍了如何生成一个正方形文件的步骤。希望对大家有所帮助。 ... [详细]
    • Netty源代码分析服务器端启动ServerBootstrap初始化
      本文主要分析了Netty源代码中服务器端启动的过程,包括ServerBootstrap的初始化和相关参数的设置。通过分析NioEventLoopGroup、NioServerSocketChannel、ChannelOption.SO_BACKLOG等关键组件和选项的作用,深入理解Netty服务器端的启动过程。同时,还介绍了LoggingHandler的作用和使用方法,帮助读者更好地理解Netty源代码。 ... [详细]
    • 基于移动平台的会展导游系统APP设计与实现的技术介绍与需求分析
      本文介绍了基于移动平台的会展导游系统APP的设计与实现过程。首先,对会展经济和移动互联网的概念进行了简要介绍,并阐述了将会展引入移动互联网的意义。接着,对基础技术进行了介绍,包括百度云开发环境、安卓系统和近场通讯技术。然后,进行了用户需求分析和系统需求分析,并提出了系统界面运行流畅和第三方授权等需求。最后,对系统的概要设计进行了详细阐述,包括系统前端设计和交互与原型设计。本文对基于移动平台的会展导游系统APP的设计与实现提供了技术支持和需求分析。 ... [详细]
    author-avatar
    blue秋夜听雨321
    这个家伙很懒,什么也没留下!
    PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
    Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有