补充。我在发了这篇文章之后,后面又要爬这个论坛。然后我发现我没有认真观察那个网页的源码,所以爬的不全。大意了。

不过问题也不大,看这个文章主要也是看个方法,仅供参考,仅供参考。

写法1:requests + re

# -*- coding: UTF-8 -*-
# 开发人员:萌狼蓝天
# 博客:Https://mllt.cc
# 笔记:Https://cnblogs.com/mllt
# 哔哩哔哩/微信公众号:萌狼蓝天
# 开发时间:2022/9/21
# 写法1:requests + re
import requests
import re
import csv
# 准备URL
url="http://bbs.tianya.cn/list-666-1.shtml"
# 获取页面源码
code_request = requests.get(url).content.decode("utf-8")
# 预设列表存放结果
result_list=[]
# 使用正则表达式获取响应内容
result_author = re.findall('.*?"author".*?>(.*?)</a></td>',code_request,re.S)
result_time = re.findall('<td title="(.*?)">',code_request,re.S)
# 循环输出结果
for i in range(len(result_time)): # 注意,你也可以写result_author
# 设置字典数据
result_dic = {"作者": result_author[i], "回复时间": result_time[i]}
# 将词典数据放入列表
result_list.append(result_dic)
print(result_list) # 此时的列表是由多个字典元素组成的列表
# 开始写出CSV文件
with open("result.csv","a+",encoding="utf-8") as f:
# 准备CSV表头
writer = csv.DictWriter(f,fieldnames=['作者','回复时间'])
# 写CSV表头
writer.writeheader()
# 写CSV数据
writer.writerows(result_list)
# 读取CSV
with open("result.csv",encoding="utf-8") as f:
reader = csv.DictReader(f)
for row in reader:
print(row)

写法2:urllib + re

# -*- coding: UTF-8 -*-
# 开发人员:萌狼蓝天
# 博客:Https://mllt.cc
# 笔记:Https://cnblogs.com/mllt
# 哔哩哔哩/微信公众号:萌狼蓝天
# 开发时间:2022/9/21
# 写法2:urllib + re
import re
from urllib import request
import csv import urllib3
url="http://bbs.tianya.cn/list-666-1.shtml"
code_request = request.urlopen(url=url)
code_request=code_request.read().decode("utf-8")
# 预设列表存放结果
result_list=[]
# 使用正则表达式获取响应内容
result_author = re.findall('.*?"author".*?>(.*?)</a></td>',code_request,re.S)
result_time = re.findall('<td title="(.*?)">',code_request,re.S)
# 循环输出结果
for i in range(len(result_time)): # 注意,你也可以写result_author
# 设置字典数据
result_dic = {"作者": result_author[i], "回复时间": result_time[i]}
# 将词典数据放入列表
result_list.append(result_dic)
print(result_list) # 此时的列表是由多个字典元素组成的列表
# 开始写出CSV文件
with open("result.csv","a+",encoding="utf-8") as f:
# 准备CSV表头
writer = csv.DictWriter(f,fieldnames=['作者','回复时间'])
# 写CSV表头
writer.writeheader()
# 写CSV数据
writer.writerows(result_list)
# 读取CSV
with open("result.csv",encoding="utf-8") as f:
reader = csv.DictReader(f)
for row in reader:
print(row)

方法3:request + bs4

# -*- coding: UTF-8 -*-
# 开发人员:萌狼蓝天
# 博客:Https://mllt.cc
# 笔记:Https://cnblogs.com/mllt
# 哔哩哔哩/微信公众号:萌狼蓝天
# 开发时间:2022/9/21
# 写法3:requests + bs4
from bs4 import BeautifulSoup
import requests
import csv # 准备URL
url = "http://bbs.tianya.cn/list-666-1.shtml"
# 获取页面源码
code_request = requests.get(url).content.decode("utf-8")
# 转为Soup对象
soup = BeautifulSoup(code_request, "lxml")
# 获取 带有bg样式的标签tr 的源码
code_list = soup.findAll("tr", attrs={"class": "bg"})
# 预设列表存放结果
result_list = []
for i in code_list:
# 准备空字典以存放所需数据
result_dic = {}
# 使用正则表达式获取响应内容 | .replace("\n","")删除换行符 .lstrip()和.rstrip()删除文本左、右空白
result_title = i.findAll("td", attrs={"class": "td-title"})[0].findAll("a")[0].text.replace("\n","").lstrip().rstrip()
result_author = i.find_all("a", attrs={"class": "author"})[0].text.replace("\n", "").lstrip().rstrip()
result_time = i.find_all("td")[-1].text.replace("\n", "").lstrip().rstrip()
# print("---------测试----------")
# print(result_title,result_author,result_time)
# print("---------测试----------")
result_dic["标题"] = result_title
result_dic["作者"] = result_author
result_dic["回复时间"] = result_time
# 将词典数据放入列表
result_list.append(result_dic)
# print(result_list) # 此时的列表是由多个字典元素组成的列表
# 开始写出CSV文件
with open("resultb.csv", "a+", encoding="utf-8") as f:
# 准备CSV表头
writer = csv.DictWriter(f, fieldnames=["标题",'作者', '回复时间'])
# 写CSV表头
writer.writeheader()
# 写CSV数据
writer.writerows(result_list)
# 读取CSV
with open("resultb.csv", encoding="utf-8") as f:
reader = csv.DictReader(f)
for row in reader:
print(row)

【爬虫】爬虫简单举例(三种写法) 涉及requests、urllib、bs4,re的更多相关文章

  1. 总结 React 组件的三种写法 及最佳实践 [涨经验]

    React 专注于 view 层,组件化则是 React 的基础,也是其核心理念之一,一个完整的应用将由一个个独立的组件拼装而成. 截至目前 React 已经更新到 v15.4.2,由于 ES6 的普 ...

  2. 爬虫入门系列(三):用 requests 构建知乎 API

    爬虫入门系列目录: 爬虫入门系列(一):快速理解HTTP协议 爬虫入门系列(二):优雅的HTTP库requests 爬虫入门系列(三):用 requests 构建知乎 API 在爬虫系列文章 优雅的H ...

  3. insert into 语句的三种写法

    insert into 语句的三种写法 方式1. INSERT INTO t1(field1,field2) VALUES (v001,v002);            // 明确只插入一条Valu ...

  4. setInterval()的三种写法

    前言: setInterval("fun()",time)有两个参数:fun()为要执行的函数:time为多久执行一次函数,单位是毫秒: 我们做一个简单的例子,就是每隔5s弹出一个 ...

  5. 总结 React 组件的三种写法 及最佳实践

    React 专注于 view 层,组件化则是 React 的基础,也是其核心理念之一,一个完整的应用将由一个个独立的组件拼装而成. 截至目前 React 已经更新到 v15.4.2,由于 ES6 的普 ...

  6. 链接属性rel=’external’、rel=’nofollow’、rel=’external nofollow’三种写法的区别

    链接属性rel='external'.rel='nofollow'.rel='external nofollow'三种写法的区别   大家应该都知道rel='nofllow'的作用,它是告诉搜索引擎, ...

  7. jquery 在页面中三种写法

    jQuery 分 2 个系列版本 1.x 与 2.x,主要的区别在于 2.x 不再兼容 IE6.7.8浏览器,这样做的目的是为了兼容移动端开发.由于减少了一些代码,使得该版本比 jQuery 1.x ...

  8. HTML颜色的三种写法

    颜色的三种写法: 1.16进制代码     #000000 2.英文字母         red 3.rgba                rgba(0-255,0,0,0-1) 例如: <b ...

  9. (转)Ext.Button点击事件的三种写法

    转自:http://maidini.blog.163.com/blog/static/377627042008111061844345/ ExtJs的写法太灵活了,现在收集了关于Button点击事件的 ...

  10. 16_点击事件第三种写法_activity实现接口

    第一种写法是有名内部类,第二种写法是匿名内部类,第三种写法是MainActivity实现接口OnClickListener.直接让MainActivity实现了OnClickListener这个接口. ...

随机推荐

  1. Java日期时间API系列32-----Jdk8中java.time包中的新的日期时间API类应用,时间工具包 xk-time 1.0.0 版本完成。

    从Java日期时间API系列第一篇博客开始,利用业余时间对Java日期时间API源码进行了系统的.多次的阅读实践,包括Date.LocalDate.LocalDateTime.LocalTime.In ...

  2. 105份墨天轮“国产化迁移”干货文档汇总(含TiDB、openGauss、上云等)

    当前国产数据库产品百花齐放,随着政策的推进.技术的迭代以及市场需求的逐步扩大,数据库国产化正在加速进行中,有越来越多的金融.通信.制造.互联网等企业机构以及政府机关单位将业务系统从Oracle.MyS ...

  3. DirectoryOpus插件:“照得标管理器”-海量照片分类管理好帮手!

      照得标管理器 前言   名词解释:"照得标管理器",即:照片得到标签管理器,后文统一简称"照得标管理器"或"照得标".  注:请不要和抖 ...

  4. KubeSphere 使用 OpenLDAP 进行统一认证完全指南

    作者:申红磊,青云QingCloud 容器解决方案架构师,开源项目爱好者,KubeSphere Member. 背景 在实际使用中,会有一些用户,在不同场景中经常碰到 OpenLDAP 对接问题: 能 ...

  5. Next.js 从零入门到实战 3:2024最新完整教程 | 包含SSR、API路由和性能优化

    CSS样式学习 上一篇文章讲到如何创建一个脚手架程序,目前我们已经有了一个nextjs的基本框架,因此我们可以在这个基础上进行改造.打开我们项目中的page.tsx页面,这里是程序的主页面,也就是我们 ...

  6. 12万字的java面试题及答案整理(2024新版)

    前言 本来想着给自己放松一下,刷刷博客,慕然回首,final有哪些用法?static都有哪些用法?java的精度算法?java运算逻辑?异常处理?似乎有点模糊了,那就大概看一下Java基础面试题吧.好记 ...

  7. [TAD] Triangles of Absolute Differences-反帕斯卡三角形

    [IMO2018] Triangles of Absolute Differences-反帕斯卡三角形 前言 叠甲 笔者不是学数竞的,在此感谢我的数竞生为我讲解题目. 笔者学艺不精,且知识面浅薄. 所 ...

  8. Redis中常见的数据类型及其应用场景

    五种常见数据类型 Redis中的数据类型指的是 value存储的数据类型,key都是以String类型存储的,value根据场景需要,可以以String.List等类型进行存储. 各数据类型介绍: R ...

  9. Swing 线程之SwingUtilities.invokeLater()

    现在我们要做一个简单的界面. 包括一个进度条.一个输入框.开始和停止按钮. 需要实现的功能是: 当点击开始按钮,则更新进度条,并且在输入框内把完成的百分比输出(这里只做例子,没有真正去做某个工作). ...

  10. golang之函数工具库lancet

    lancet(柳叶刀)是一个全面.高效.可复用的go语言工具函数库. lancet受到了java apache common包和lodash.js的启发. 简体中文 | English 特性 全面.高 ...