【爬虫】爬虫简单举例(三种写法) 涉及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这个接口. ...
随机推荐
- Android UsbDeviceManager 代码分析
USBDeviceManager是一个Android系统中用于管理USB设备的类,它是系统服务之一.其主要功能是控制USB设备的连接和断开,以及管理USB设备的权限和状态.下面是对USBDeviceM ...
- Linux PSI--Pressure Stall Information
Google在在Android11及之后版本的LMKD中,使用了psi作为杀进程的策略,本文简单介绍下psi. 转载自使用PSI(Pressure Stall Information)监控服务器资源_ ...
- WebAssembly C++开发环境搭建
WebAssembly 开发环境搭建 简介 WebAssembly 是一种新的编码方式,可以在现代的网络浏览器中运行 - 它是一种低级的类汇编语言,具有紧凑的二进制格式,可以接近原生的性能运行,并为诸 ...
- 77.const声明对象修改对象里面的值会触发报错吗
不会,因为对象是复杂类型数据 :对象的地址保存在栈内存中,对象的数据保存在堆内存中 : 只要对象的地址不发生改变,无论堆内存的对象数据如何改变,对象的值就不会改变 :
- Nuxt.js 应用中的 imports:extend 事件钩子详解
title: Nuxt.js 应用中的 imports:extend 事件钩子详解 date: 2024/10/28 updated: 2024/10/28 author: cmdragon exce ...
- MaskGCT,AI语音克隆大模型本地部署(Windows11),基于Python3.11,TTS,文字转语音
前几天,又一款非自回归的文字转语音的AI模型:MaskGCT,开放了源码,和同样非自回归的F5-TTS模型一样,MaskGCT模型也是基于10万小时数据集Emilia训练而来的,精通中英日韩法德6种语 ...
- 在Windows环境下使用AMD显卡运行Stable Diffusion
现在用的电脑是 21 年配的,当时并没有 AI 相关的需求,各种各样的原因吧,抉择后选择了 AMD 的显卡,但在 2024 年的今天,使用 AI 进行一些工作已不再是什么罕见的需求,所以我也想尝试一下 ...
- 掌控物体运动艺术:图扑 Easing 函数实践应用
现如今,前端开发除了构建功能性的网站和应用程序外,还需要创建具有吸引力且尤为流畅交互的用户界面,其中动画技术在其中发挥着至关重要的作用.在数字孪生领域,动画的应用显得尤为重要.数字孪生技术通过精确模拟 ...
- 题解:「NOIP2022 提高组」种花
题解:「NOIP2022 提高组」种花 题目大意:给定一个 \(n \times m\) 的01矩阵,0表示可以种花,1表示土坑(无法种花),现在要在图上种出一个C型或F型(C,F横着的两条线的长度都 ...
- PostgreSQL加密连接SSL配置
PostgreSQL加密连接SSL配置 环境说明 操作系统 主机名 IP 类型 说明 CentOS Linux release 7.6.1810 (Core) centos7.6 192.168.1. ...