爬虫进阶之社区实战

yuyalinnb   ·   发表于 2022-11-13 12:09:00   ·   技术文章

0x01 前言

阅读时间:4分钟左右
众所周知,社区几乎没有反爬策略,于是我们可以轻松地开发一个爬虫。
(脚本,采集的数据放到了最后)

0x02 编写

1.确定非置顶帖子名字的xpath

首先,在登录状态下进入社区https://bbs.zkaq.cn/


我们的目标是爬取每一页的每个帖子,但是不包含重复的置顶帖子,我们这里将使用绝对路径的方法。我们看一下源码,找到帖子名字所在的位置检查,然后右键,copy,copy xpath。但是这个复制出来的是位置,不是值,所以要增加text()。另一方面,我们只选中了一个帖子名字,那么怎么选中除了置顶的所有的帖子名字呢?

  1. /html/body/div[1]/div[1]/div[3]/div[2]/div[8]/div/h4/a[2]/span

这就是图中的PTE考试靶机什么的xpath位置,可以看见这里有很多切片,那么我们可以尝试去除任意切片,观察选中的帖子。经过尝试,删除[8]可以选中所有非置顶帖子。而且正好没有选中置顶帖子。

  1. /html/body/div[1]/div[1]/div[3]/div[2]/div/div/h4/a[2]/span

2. 观察url变化

进入

  1. https://bbs.zkaq.cn/new/1.html


再切换到下一页

  1. https://bbs.zkaq.cn/new/2.html


可以发现就是html前面的数字加了1,我们可以使用for循环增加每一个数字。

3. 编写

  1. import requests
  2. from lxml import etree
  3. i = 1
  4. while i <= 260:
  5. link = f'https://bbs.zkaq.cn/new/{i}.html'
  6. response = requests.get(link)
  7. i = i + 1
  8. text = response.content.decode()
  9. html = etree.HTML(text)
  10. a_list = html.xpath("/html/body/div[1]/div[1]/div[3]/div[2]/div/div/h4/a[2]/span/text()")
  11. for a in a_list:
  12. print(a)

import就是导入库,这里导入的是请求库和解析库
i = 1是给i赋一个初始值,如果直接while会报错
while是指在i<=260时,不断执行以下操作:
访问这个网页,并且访问完后这个i继续加1,就是访问下一页,直到260页。
然后对response进行utf8解码,赋值给text
然后使用etree的HTML类初始化,赋值给html
然后使用xpath语法提取所有的帖子名
由于得到的是列表,所以用for循坏提取列表里的每个元素,最后打印出来,就是我们想要的了。

用户名金币积分时间理由
Track-劲夫 20.00 0 2022-11-19 21:09:16 一个受益终生的帖子~~

打赏我,让我更有动力~

附件列表

bbs.zip   文件大小:0M (下载次数:0)

0 条回复   |  直到 2022-11-13 | 513 次浏览
登录后才可发表内容
返回顶部 投诉反馈

© 2016 - 2024 掌控者 All Rights Reserved.