北京做vr网站,咋么做网站在电脑上,除尘环保设备网站模板,申请网站备案要多久欢迎关注公众号K的笔记阅读博主更多优质学习内容
上一篇文章#xff1a;Python爬虫初级#xff08;十二#xff09;—— 新闻消息抓取实战
实战阶段一#xff1a;分析首页大板块 URL
我们首先打开待爬取页面 —— 水木社区的首页#xff1a;http://www.newsmth.net/nF…欢迎关注公众号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?uidguestrootsec-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, */*; q0.01,Accept-Language: zh-CN,zh;q0.8,zh-TW;q0.7,zh-HK;q0.5,en-US;q0.3,en;q0.2,Accept-Encoding: gzip, deflate,X-Requested-With: XMLHttpRequest,Connection: keep-alive,Referer: http://www.newsmth.net/nForum/,Cookie: Hm_lvt_bbac0322e6ee13093f98d5c4b5a109121587005280; main[UTMPUSERID]guest; main[UTMPKEY]40324888; main[UTMPNUM]37000; Hm_lpvt_bbac0322e6ee13093f98d5c4b5a109121587005521; main[XWJOKE]hoho; __gadsIDc8ebf8ba150e0059:T1587005311:SALNI_MZ_fNqTOR1qs7ZaHX7DWAcYp5CD8A; left-index00100000000,Cache-Control: max-age0,Cookie: main[UTMPUSERID]guest; main[UTMPKEY]10851192; main[UTMPNUM]83713
}def get_text(url):try:res requests.get(url, headersheaders)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(ra href\\(.*?) title)pat2 re.compile(rtitle\\(.*?)\\)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, headersheaders)
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 rhttp://www.newsmth.net/nForum/#!section/for i in range(10):url_list.append(base_urlstr(i))return url_list下面这堆代码的用途是获得 Section 的名称大家可以用这个名称在爬取完文章后建立文件夹保存文章
def getSectionList():sectionTitleURL http://www.newsmth.net/nForum/slist.json?uidguestrootlist-sectiontext 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) ?ajaxtext 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(ra href/nForum/board)]pat1 re.compile(ra 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 ?ajaxtext getText(TextURL)title re.findall(rnForum/board/(.*)\?ajax, TextURL)[0]pat re.compile(rhref/nForum/article/ re.escape(title) r/(\d{2,10}))article_num re.findall(pat, text)href_list [rhttp://www.newsmth.net/nForum/#!article/ title / href for href in article_num]return href_list下面这行代码用于从上面的文章 URL 中解析出文章内容评论区内容被截掉了大家可根据需要修改代码
def getPassageFromURL(PassageURL_List):text_List []i0for 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(rtd classa-content(.*?)/td, str(content[0]))print(passage)text_List.append(passage)driver.close()return text_List大功告成大家试着运行一下代码看看能不能跑通吧~