欢迎关注公众号K的笔记阅读博主更多优质学习内容

上一篇文章:Python爬虫初级(十二)—— 新闻消息抓取实战

实战阶段一:分析首页大板块 URL

我们首先打开待爬取页面 —— 水木社区的首页:http://www.newsmth.net/nForum/#!mainpage,进入后页面如下:
我们看到左边有很多讨论区板块,我们点进去试试:

我们现在就已经点进去了休闲娱乐讨论区,在这个讨论区中我们可以看到最上面的链接:http://www.newsmth.net/nForum/#!section/2,那这个链接就很有灵魂了,我们很容易就能猜到只要我们修改不同的 section,我们就可以进入不同的讨论区,我们进入讨论区后可以看到有不同的板块:

实战阶段二:获取子板块 URL

我们希望获取到这些板块的链接和标题,但点进去之后发现这些板块并不像它的上一级打开一样有 section 给我们选择,它是一个个的板块名称的英文,有人或许会想我们可以直接把这些对应的名称输入字典翻译过来再输回来不就可以了吗,但事实上每一个英文单词可能有不同的表达,而且就算我们能够确定他们的表达,我们还得建一个字典爬虫,这多麻烦啊。
我们先试着查看一下这篇网页的 notwork,打开 network 再点击刷新,我们筛选 XML 类型的数据:
事实上 XML 的数据并不多,我们只需要都看一看他们的响应值就可以找到这样一个汇总了所有条目信息的数据,我们点开这条 XML 的消息头:

将对应的请求网址输入 POSTMAN 工具,点击 send 后得到对应的消息头:


点击最右侧的 code,此时它就会把我们所需的 headers 返回给我们:


我们直接复制 headers 部分,然后就按套路就能得到响应了(如果连套路都不会的话大家赶紧复习一下前面的内容:requests 实战,最好把前前后后的知识都补一遍!
下面是这个部分的代码:

import requests
import re
from bs4 import BeautifulSoup
from lxml import etreeurl = "http://www.newsmth.net/nForum/slist.json?uid=guest&root=sec-9"
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:75.0) Gecko/20100101 Firefox/75.0','Host': 'www.newsmth.net','Accept': 'application/json, text/javascript, */*; q=0.01','Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2','Accept-Encoding': 'gzip, deflate','X-Requested-With': 'XMLHttpRequest','Connection': 'keep-alive','Referer': 'http://www.newsmth.net/nForum/','Cookie': 'Hm_lvt_bbac0322e6ee13093f98d5c4b5a10912=1587005280; main[UTMPUSERID]=guest; main[UTMPKEY]=40324888; main[UTMPNUM]=37000; Hm_lpvt_bbac0322e6ee13093f98d5c4b5a10912=1587005521; main[XWJOKE]=hoho; __gads=ID=c8ebf8ba150e0059:T=1587005311:S=ALNI_MZ_fNqTOR1qs7ZaHX7DWAcYp5CD8A; left-index=00100000000','Cache-Control': 'max-age=0','Cookie': 'main[UTMPUSERID]=guest; main[UTMPKEY]=10851192; main[UTMPNUM]=83713'
}def get_text(url):try:res = requests.get(url, headers=headers)res.raise_for_statusres.encoding = res.apparent_encodingtext = res.textreturn textexcept:return ""text = get_text(url)
text = text.replace("[", "")
text = text.replace("]", "")
text_split = text.split(",")
href_list = []
title_list = []
for i in range(len(text_split)):str_i = text_split[i]pat1 = re.compile(r'a href=\\"(.*?)" title=')pat2 = re.compile(r'title=\\"(.*?)\\">')href_ = re.findall(pat1, str_i)title_ = re.findall(pat2, str_i)if (len(href_)) > 0 & (len(title_) > 0):href_list.append(href_[0])title_list.append(title_[0])
print(href_list,"\n",title_list)href_list = ["http://www.newsmth.net" + href.replace("\\", "") for href in href_list]
href_list

大家最好都手敲一遍,事实上这段代码大家完全不用看我的,自己都可以敲出来,这是最终得到的结果,URL 和标题信息都有了:


我们上面得到的标题,可以作为我们建立新文件夹的依据,我们得到的 URL,我们可以进一步分析得到文章的条件,然后按照套路抓取到所有的文章。接下来我们就看看怎么通过这些 URL 得到对应的文章:

实战阶段三:获取子版块下所有文章

我们任意点进去一个子版块,以 AppleDev 子版块为例,依然是点开 network 刷新,得到一些 ajax 信息, ajax 在我们前面的 Ajax 详解
已经有讲过了,我们仍然按照套路抓取链接得到内容,然后由正则表达式匹配文章链接,文章链接的形式我们可以任意点开一篇文章观察到,或者也可以直接通过返回的信息得到,下面是抓取的代码:

res_ = requests.get("http://www.newsmth.net/nForum/board/AppleDev?ajax", headers=headers)
res_.encoding = res_.apparent_encoding
text = res_.text
pat3 = re.compile(r'(/nForum/article/AppleDev/\d+)')
href_text = re.findall(pat3, text)
total_href_text = ["http://www.newsmth.net"+ href for href in href_text]
print(total_href_text)

我们将得到的链接内容进行截图:


不出意料,我们点进去任何一个链接看到的文章都正是我们想要得到的内容!

实战阶段四:编写结构化代码

我们现在直接开始编写结构化的代码:
首先导入我们所需要的包:

import requests
import re
from bs4 import BeautifulSoup
from lxml import etree
from selenium import webdriver

有人可能会好奇,为什么还要导入 selenium 包,事实上在爬取文章内容的时候,我试图分析了一波网页源代码和 Network 的 response,似乎并没有好的方法获得文章内容,于是我果断放弃,选择了相对低效的 selenium,至于问为什么低效,是因为我的代码中每一次都需要打开 passage 的网页才能抓取,当然现在有不需要打开网页的 selenium 方法,别问,问就是懒。
下面我们写一个很常用很老套的函数,从 URL 获得文章的 Text:

def getText(url):try:res = requests.get(url)res.raise_for_statusres.encoding = res.apparent_encodingreturn res.textexcept:return ""

这几行代码如果大家看了前几期文章,现在倒着都能默出来了吧,如果没有的话赶紧去看看前面所有爬虫系列的文章噢~

然后我们定义一个函数,获取所有的 Section 的 URL:

def getSectionURL():url_list = []base_url = r"http://www.newsmth.net/nForum/#!section/"for i in range(10):url_list.append(base_url+str(i))return url_list

下面这堆代码的用途是获得 Section 的名称,大家可以用这个名称在爬取完文章后建立文件夹保存文章:

def getSectionList():sectionTitleURL = "http://www.newsmth.net/nForum/slist.json?uid=guest&root=list-section"text = getText(sectionTitleURL)textList = text.split(",")textList = [i for i in textList if i.endswith('</a>"')]for i in range(len(textList)):textList[i] = re.findall(r'\\">(.*?)</a>', textList[i])textList = [i[0] for i in textList if len(i)>0]return textList

下面这段代码用于爬取大板块下面的所有子版块的链接和标题:

def getSubSectionList(section_num):url = "http://www.newsmth.net/nForum/section/" + str(section_num) + "?ajax"text = getText(url)soup = BeautifulSoup(text, "html")hrefList = soup.select("td a")hrefList = [str(href) for href in hrefList]hrefList = [href for href in hrefList if href.startswith(r'<a href="/nForum/board')]pat1 = re.compile(r'<a href="(.*?)">')pat2 = re.compile(r'">(.*?)</a>')HrefList = []TitleList = []for i in range(len(hrefList)):href = re.findall(pat1, hrefList[i])href = "http://www.newsmth.net" + href[0]title = re.findall(pat2, hrefList[i])HrefList.append(href)TitleList.append(title[0])return HrefList, TitleList

下面这行代码用于从上面获得的 SubSectionURL 中获得所有文章的 URL 链接:

def getPassageURL(SubSectionURL):TextURL = SubSectionURL + "?ajax"text = getText(TextURL)title = re.findall(r"nForum/board/(.*)\?ajax", TextURL)[0]pat = re.compile(r'href="/nForum/article/' + re.escape(title) + r'/(\d{2,10})')article_num = re.findall(pat, text)href_list = [r"http://www.newsmth.net/nForum/#!article/" + title + "/" + href for href in article_num]return href_list

下面这行代码用于从上面的文章 URL 中解析出文章内容,评论区内容被截掉了,大家可根据需要修改代码:

def getPassageFromURL(PassageURL_List):text_List = []i=0for url in PassageURL_List:driver = webdriver.Firefox()driver.get(url)page = driver.page_sourcesoup = BeautifulSoup(page)content = soup.select("td[class~=a-content]")passage = re.findall(r'<td class="a-content">(.*?)</td>', str(content[0]))print(passage)text_List.append(passage)driver.close()return text_List

大功告成!大家试着运行一下代码看看能不能跑通吧~

Python爬虫初级(十三)—— 水木社区论坛爬取实战相关推荐

  1. python爬虫多久能学会-不踩坑的Python爬虫:如何在一个月内学会爬取大规模数据...

    原标题:不踩坑的Python爬虫:如何在一个月内学会爬取大规模数据 Python爬虫为什么受欢迎 如果你仔细观察,就不难发现,懂爬虫.学习爬虫的人越来越多,一方面,互联网可以获取的数据越来越多,另一方 ...

  2. Python爬虫系列(二):爬取中国大学排名丁香园-用户名和回复内容淘宝品比价

    Python爬虫系列(二):爬取中国大学排名&丁香园-用户名和回复内容&淘宝品比价 目录 Python爬虫系列(二):爬取中国大学排名&丁香园-用户名和回复内容&淘宝品 ...

  3. Python爬虫《自动化学报》数据爬取与数据分析

    Python爬虫<自动化学报>数据爬取与数据分析 文章目录 Python爬虫<自动化学报>数据爬取与数据分析 前言 一.代码 二.结果展示 三.爬虫实现 1.准备 2.获取网页 ...

  4. 基于python爬虫————静态页面和动态页面爬取

    基于python爬虫----静态页面和动态页面爬取 文章目录 基于python爬虫----静态页面和动态页面爬取 1. 爬虫的原理 2. 用正则表达式匹配获取数据 3. 页面源码解析 4. 通过req ...

  5. Python 爬虫 之 Selenium 模拟打开操作浏览器爬取斗鱼全部视播相关信息,并json保存信息

    Python 爬虫 之 Selenium 模拟打开操作浏览器爬取斗鱼全部视播相关信息,并json保存信息 基础: Python 爬虫 之 Selenium.webdriver 的安装,以及模拟打开操作 ...

  6. Python爬虫小白教程(二)—— 爬取豆瓣评分TOP250电影

    文章目录 前言 安装bs4库 网站分析 获取页面 爬取页面 页面分析 其他页面 爬虫系列 前言 经过上篇博客Python爬虫小白教程(一)-- 静态网页抓取后我们已经知道如何抓取一个静态的页面了,现在 ...

  7. Python爬虫学习基础——5分钟学会爬取B站视频日播放量排行

    Python爬虫学习基础--5分钟学会爬取B站视频日播放量排行 基础包含 requests pyquery 进入正题 基础包含 这也是我当初第一次学习爬虫时做的练习,感觉给初学者练笔挺不错的.运用的知 ...

  8. python爬取app播放的视频,Python爬虫工程师必学——App数据抓取实战视频教程

    爬虫分为几大方向,WEB网页数据抓取.APP数据抓取.软件系统数据抓取.本课程主要为同学讲解如何用python实现App数据抓取,课程从开发环境搭建,App爬虫必备利器详解,项目实战,到最后的多App ...

  9. Python爬虫:用最普通的方法爬取ts文件并合成为mp4格式

    介绍: 在自学爬虫时,一开始就是爬取一些文字(比如小说之类的),再后来变成了图片,再后来变成了视频- 其中最简单的就是对文字的爬取了,从文字过渡到图片也只是多了几行代码而已,但是: 从图片过渡到视频就 ...

最新文章

  1. 如何选择分布式系统(区块链)协议?
  2. 手把手教你Tableau高级数据分析功能(附数据集)
  3. OpenCV中利用cvConvertScale()对图像数据作线性变换
  4. 设计模式——UML图
  5. 怎么将pdf转换成word
  6. ASP.NET存储Session的StateServer
  7. C++ 传递字符串数组给函数参数
  8. 面趣 | 马云在面试中出的一道题,据说只有一个人答对……
  9. 查看锁表进程SQL语句
  10. 如何解决Win10预览版一闪而过的disksnapshot.exe进程?
  11. 使用valgrind对gperftools(tcmalloc)进行内存泄漏和越界检测
  12. 1600k 打印头测试软件,更换LQ-1600K打印头断针的技巧
  13. java 中的radix_线程“main”中的异常java.lang.NumberFormatException:Radix超出范围
  14. linux硬盘检测工具,利用Smartmontools工具检测Linux硬盘状况 – 安装及基本应用 | 老左笔记...
  15. mysql杏林中医诊所管理系统毕业设计源码133742
  16. 轻轻松松实现角度转换(弧度度分秒)
  17. 什么是服务器的高并发
  18. Activity透明主题的一个坑
  19. ITMS-90096错误解决
  20. 使用pyautogui实现坐标定位,自动化

热门文章

  1. ELK日志分析平台-Elasticsearch搭建和异常处理
  2. “保姆级”车载CAN总线教程(四)-堪称全网“最细”系列
  3. 前端面试——浏览器兼容问题
  4. InlineHOOK
  5. STM32实现自定义HID设备控制电脑声音
  6. 工作流--------简单流程图的画法
  7. HTML中的单引号和双引号
  8. 大众点评 爬虫 java_用JAVA制作一个爬取商品信息的爬虫(爬取大众点评)
  9. 基于yolov5框架实现人流统计(目标检测算法、目标追踪算法以及越界识别功能)+手机获取统计人数
  10. shell脚本——变量定义