【爬虫】爬虫简单举例(三种写法) 涉及requests、urllib、bs4,re
补充。我在发了这篇文章之后,后面又要爬这个论坛。然后我发现我没有认真观察那个网页的源码,所以爬的不全。大意了。
不过问题也不大,看这个文章主要也是看个方法,仅供参考,仅供参考。
写法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的更多相关文章
- 总结 React 组件的三种写法 及最佳实践 [涨经验]
React 专注于 view 层,组件化则是 React 的基础,也是其核心理念之一,一个完整的应用将由一个个独立的组件拼装而成. 截至目前 React 已经更新到 v15.4.2,由于 ES6 的普 ...
- 爬虫入门系列(三):用 requests 构建知乎 API
爬虫入门系列目录: 爬虫入门系列(一):快速理解HTTP协议 爬虫入门系列(二):优雅的HTTP库requests 爬虫入门系列(三):用 requests 构建知乎 API 在爬虫系列文章 优雅的H ...
- insert into 语句的三种写法
insert into 语句的三种写法 方式1. INSERT INTO t1(field1,field2) VALUES (v001,v002); // 明确只插入一条Valu ...
- setInterval()的三种写法
前言: setInterval("fun()",time)有两个参数:fun()为要执行的函数:time为多久执行一次函数,单位是毫秒: 我们做一个简单的例子,就是每隔5s弹出一个 ...
- 总结 React 组件的三种写法 及最佳实践
React 专注于 view 层,组件化则是 React 的基础,也是其核心理念之一,一个完整的应用将由一个个独立的组件拼装而成. 截至目前 React 已经更新到 v15.4.2,由于 ES6 的普 ...
- 链接属性rel=’external’、rel=’nofollow’、rel=’external nofollow’三种写法的区别
链接属性rel='external'.rel='nofollow'.rel='external nofollow'三种写法的区别 大家应该都知道rel='nofllow'的作用,它是告诉搜索引擎, ...
- jquery 在页面中三种写法
jQuery 分 2 个系列版本 1.x 与 2.x,主要的区别在于 2.x 不再兼容 IE6.7.8浏览器,这样做的目的是为了兼容移动端开发.由于减少了一些代码,使得该版本比 jQuery 1.x ...
- HTML颜色的三种写法
颜色的三种写法: 1.16进制代码 #000000 2.英文字母 red 3.rgba rgba(0-255,0,0,0-1) 例如: <b ...
- (转)Ext.Button点击事件的三种写法
转自:http://maidini.blog.163.com/blog/static/377627042008111061844345/ ExtJs的写法太灵活了,现在收集了关于Button点击事件的 ...
- 16_点击事件第三种写法_activity实现接口
第一种写法是有名内部类,第二种写法是匿名内部类,第三种写法是MainActivity实现接口OnClickListener.直接让MainActivity实现了OnClickListener这个接口. ...
随机推荐
- Java日期时间API系列32-----Jdk8中java.time包中的新的日期时间API类应用,时间工具包 xk-time 1.0.0 版本完成。
从Java日期时间API系列第一篇博客开始,利用业余时间对Java日期时间API源码进行了系统的.多次的阅读实践,包括Date.LocalDate.LocalDateTime.LocalTime.In ...
- 105份墨天轮“国产化迁移”干货文档汇总(含TiDB、openGauss、上云等)
当前国产数据库产品百花齐放,随着政策的推进.技术的迭代以及市场需求的逐步扩大,数据库国产化正在加速进行中,有越来越多的金融.通信.制造.互联网等企业机构以及政府机关单位将业务系统从Oracle.MyS ...
- DirectoryOpus插件:“照得标管理器”-海量照片分类管理好帮手!
照得标管理器 前言 名词解释:"照得标管理器",即:照片得到标签管理器,后文统一简称"照得标管理器"或"照得标". 注:请不要和抖 ...
- KubeSphere 使用 OpenLDAP 进行统一认证完全指南
作者:申红磊,青云QingCloud 容器解决方案架构师,开源项目爱好者,KubeSphere Member. 背景 在实际使用中,会有一些用户,在不同场景中经常碰到 OpenLDAP 对接问题: 能 ...
- Next.js 从零入门到实战 3:2024最新完整教程 | 包含SSR、API路由和性能优化
CSS样式学习 上一篇文章讲到如何创建一个脚手架程序,目前我们已经有了一个nextjs的基本框架,因此我们可以在这个基础上进行改造.打开我们项目中的page.tsx页面,这里是程序的主页面,也就是我们 ...
- 12万字的java面试题及答案整理(2024新版)
前言 本来想着给自己放松一下,刷刷博客,慕然回首,final有哪些用法?static都有哪些用法?java的精度算法?java运算逻辑?异常处理?似乎有点模糊了,那就大概看一下Java基础面试题吧.好记 ...
- [TAD] Triangles of Absolute Differences-反帕斯卡三角形
[IMO2018] Triangles of Absolute Differences-反帕斯卡三角形 前言 叠甲 笔者不是学数竞的,在此感谢我的数竞生为我讲解题目. 笔者学艺不精,且知识面浅薄. 所 ...
- Redis中常见的数据类型及其应用场景
五种常见数据类型 Redis中的数据类型指的是 value存储的数据类型,key都是以String类型存储的,value根据场景需要,可以以String.List等类型进行存储. 各数据类型介绍: R ...
- Swing 线程之SwingUtilities.invokeLater()
现在我们要做一个简单的界面. 包括一个进度条.一个输入框.开始和停止按钮. 需要实现的功能是: 当点击开始按钮,则更新进度条,并且在输入框内把完成的百分比输出(这里只做例子,没有真正去做某个工作). ...
- golang之函数工具库lancet
lancet(柳叶刀)是一个全面.高效.可复用的go语言工具函数库. lancet受到了java apache common包和lodash.js的启发. 简体中文 | English 特性 全面.高 ...