Python爬虫构建

3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 导入所需模块
import requests
from bs4 import BeautifulSoup

cookie = 'this is cookies'
cookies = {i.split("=")[0]:i.split("=")[-1] for i in cookie.split("; ")}
headers = {
'User-Agent': 'this is user-agent',
}
for page in range(10):
url = {"ng2":'https://bbs.nga.cn/thread.php?fid=-447601&page=%s' %page,
"ark":'https://bbs.nga.cn/thread.php?fid=-34587507&page=%s' %page}
response = requests.get(url['ark'], headers=headers,cookies=cookies)
soup = BeautifulSoup(response.text, 'lxml')
for each in soup.find_all('tbody'):
title = each.find('a',class_ = 'topic').get_text(strip=True)
f=open('data'+'_'+'ark'+'.txt', 'a', encoding='utf-8')
f.write('\n'.join([title]))
f.write('\n')
f.close()
print('response.status_code ==',response.status_code)

关于爬虫

本质是一个访问网站,提取某些信息的程序。

“爬取”这个动词描述获取数据的过程。其实比起爬取,爬虫的行为更像是递交一个申请表,申请到一本html文件,然后对着这本html文件写了一篇摘要呈现给用户。

理论上说,人来通过浏览器手动记录数据本质和爬虫一样,但爬虫效率高,容易把服务器爬出问题。

关于我这个爬虫

用来爬ngabbs.com的某些版面帖子标题,用于数据分析,绝对不是干什么坏事。

解读

首先我是使用了beautifulsoup4request库。不得不说python的库是真的方便。

3
1
2
import requests
from bs4 import BeautifulSoup

然后我需要清理一下之前生成的残留文件,因此我需要os来获取当前路径下的文件并移除:
3
1
2
3
4
5
import os

path = 'data'+'_'+'ark'+'.txt'
if os.path.exists(path):
os.remove(path)

然后是构建请求。

请求需要Cookies,否则会报403错误(无权限);

Cookies不能直接提交,需要转换为字典;

请求需要请求头,也就是headers,里面包含User-Agent。一开始我不知道,把Cookies也放在了里面。事实上Cookies应该单独提交;

请求需要url,因为我需要不同版面,不同页数的数据,因此构建了一个字典,使用助记词对应url。令我惊叹的、很人性化的一点是,可以使用%s和追加%page来实现变参的作用;

最后,我们调用了get方法,得到的是response

然后使用BeautifulSoup对其进行解码,得到soup

3
1
2
3
4
5
6
7
8
9
10
cookie = 'this is cookies'                       
cookies = {i.split("=")[0]:i.split("=")[-1] for i in cookie.split("; ")}
headers = {
'User-Agent': 'this is user-agent',
}
for page in range(10):
url = {"ng2":'https://bbs.nga.cn/thread.php?fid=-447601&page=%s' %page,
"ark":'https://bbs.nga.cn/thread.php?fid=-34587507&page=%s' %page}
response = requests.get(url['ark'], headers=headers,cookies=cookies)
soup = BeautifulSoup(response.text, 'lxml')

然后是写入文件,这部分折磨了我好久。我一开始的版本是:
3
1
2
3
4
5
6
for each in soup.find_all('tbody'): 
title = each.find('a',class_ = 'topic').get_text(strip=True)
with open('data'+'_'+'ark'+'.txt', 'w', encoding='utf-8') as f:
f.write('\n'.join([title]))
f.write('\n')
f.close()

但这样写会让文件的写入覆盖前一个,也就是说,无数轮循环结束,文件里只能保留最后一个标题。

但我不知道为什么,怀疑是with open('data'+'_'+'ark'+'.txt', 'w', encoding='utf-8') as f:的问题。我将其改成了f = open('data'+'_'+'ark'+'.txt', 'w', encoding='utf-8'),但还是同样的问题。

其实我的怀疑是对的,但没怀疑到点子上。

事实上是这个:

3
1
with open('data'+'_'+'ark'+'.txt', 'a', encoding='utf-8') as f:

注意到区别了吗?

‘a’ 和 ‘w’。

我应该再多读读文件操作那章的。

3
1
print('response.status_code ==',response.status_code)

这句不用多说,是打印状态值。一开始疯狂报403、411,终于稳定报200之后,我真的是甚是欣慰。

爬取的成果如下:(碍于篇幅,只展示第一页的)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
[公告] [四周年活动第一弹]分享罗德岛的年度工作报告,赢版面声望!(抽30位幸运坛友赠送周边一份!)
[ROLL] 明日方舟四周年庆典签到活动 抽取iPad手办京东卡等周边大奖
[剧情讨论] [闲谈交流] 关于“坠落的星星”,我发现一个华点
黄铁峡谷18:“弑君者III:狼牙”+“源石环境:活性III”
[可能火星]如果下个月是异格阿葬的话,他就是第77个六星
[全新开业]龙门茶馆 - 一盅两盏,畅所欲言
[提问]新人放入坑,有一堆疑问
汐斯塔扭蛋广场
[安科/安价]出场文物是各位干员的泰拉博物馆奇妙夜(博士升任司岁台头头)
[失智安科]博士发现了一个奇怪的法阵
[博all]随机挑选一个男干员当小妈,但是博士想追求自己的小妈
[随缘安科][棘流勇境]极境是要成为魔法帝的男人!
[ex8突袭]令人绝望的场景
[ROLL] 来roll送一块手工小莫流麻!
帮助选择困难症萌新
回忆一些老cp的发展,非常主观
莱塔尼亚大图书馆
[同人文] 《边缘》明日方舟x死亡空间
[短篇同人](阿米娅向)雷姆必拓的兔子们
[渣文笔][同人文]凯尔希之家
[葬博] [送葬人氵] 试图坚持三十天每日一葬
[提问] 对萌新来说,这次活动商店兑换优先级是什么样的
[闲谈交流] 保全派驻的一点正体验(仅限模拟器)
[保全氵]太恶心了
[破事氵]虽然不是什么特别的数字,但怎么总觉得这龙门币在骂我自己
[氵]突然在想,为什么谢拉格二期的中心不能是崖心呢?
为啥突袭0—1这么难啊,把我关了
陈陈陈陈陈陈是否还有第二异格形态的可能?
保全任务是不是有bug
和海愿绝配
[闲谈交流]各圈各平台最火CP一览,方舟上榜
[剧情讨论] 所以老干猫到底有没有自我意识
越来越喜欢叔叔了 因为我加班一个月了
才发现明日方舟干员列表的背景不是白色而是透明的
保全派驻是明日方舟最弱智最失败的模式,没有之一。
有没有基建大佬展示一下顶配基建收益
3月后入坑的人,没有夜刀玩肉鸽是不是很难受?
黄票不足 要换小火龙吗
卡西米尔竞技场
[突袭cws4](已过审)无限定,6人带阿消,操作简单,大部分时间在挂机
[泰拉记事社] #吉姆波顿 # 特里蒙晚间电波秀
[孤星]CW-S-1-AB到CW-S-4突袭摆完挂机,不过是小猪!
[中坚寻访]中坚甄选:05月18日 04:00 - 06月01日 03:59
[剧情氵]霍尔海雅与缪尔赛思人物对比分析
[攒抽氵]小刻也能看懂的零氪攒抽记录--《从大哥到缪缪》
[微考据][小车氵]Friston?神经科学?是你!——Friston 在现实世界的致敬/原型
[考据氵][抛砖引玉氵]谈“孤星”剧情中的科幻Neta(已更新DLC)
[活动奖励干员]重装-铁卫 Friston-3
[活动奖励服饰] //竞技之梦改装 - 正义骑士号



Python爬虫构建
http://petertan303.github.io/2023/05/17/Python爬虫构建/
作者
peter?
发布于
2023年5月17日
许可协议