最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

python的爬虫技术爬去糗事百科的的方法详解

来源:动视网 责编:小采 时间:2020-11-27 14:25:16
文档

python的爬虫技术爬去糗事百科的的方法详解

python的爬虫技术爬去糗事百科的的方法详解:初次学习爬虫技术,在知乎上看了如何爬去糗事百科的段子,于是打算自己也做一个。实现目标:1,爬取到糗事百科的段子 2,实现每次爬去一个段子,每按一次回车爬取到下一页技术实现:基于python的实现,利用Requests库,re库,bs4库的BeautifulSou
推荐度:
导读python的爬虫技术爬去糗事百科的的方法详解:初次学习爬虫技术,在知乎上看了如何爬去糗事百科的段子,于是打算自己也做一个。实现目标:1,爬取到糗事百科的段子 2,实现每次爬去一个段子,每按一次回车爬取到下一页技术实现:基于python的实现,利用Requests库,re库,bs4库的BeautifulSou


初次学习爬虫技术,在知乎上看了如何爬去糗事百科的段子,于是打算自己也做一个。

实现目标:1,爬取到糗事百科的段子

2,实现每次爬去一个段子,每按一次回车爬取到下一页

技术实现:基于python的实现,利用Requests库,re库,bs4库的BeautifulSoup方法来实现的

主要内容:首先我们要理清一下爬取实现的思路,我们来构建一下主体框架。第一步我们先写一个利用Requests库来获取网页的方法,第二步我们利用bs4库的BeautifulSoup方法来分析所获取的网页信息并利用正则表达式来匹配相关的段子信息。第三步我们来打印出获得的信息。以上方法我们都通过一个主函数来进行执行。

一,首先导入相关的库

import requests
from bs4 import BeautifulSoup
import bs4
import re

二,首先进行网页信息的获取

def getHTMLText(url):
 try:
 user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
 headers = {'User-Agent': user_agent}
 r = requests.get(url,headers = headers)
 r.raise_for_status()
 r.encoding = r.apparent_encoding
 return r.text
 except:
 return ""

三,把信息放到r后再进行解析

soup = BeautifulSoup(html,"html.parser")

我们需要的是段子的内容和发布人,通过网页的查看源代码我们知道段子的发布人在:

'p', attrs={'class': 'content'}中

段子的内容在

'p', attrs={'class': 'author clearfix'}中

所以我们通过bs4库的方法来提取这两个标签的具体内容

def fillUnivlist(lis,li,html,count):
 soup = BeautifulSoup(html,"html.parser")
 try:
 a = soup.find_all('p', attrs={'class': 'content'})
 ll = soup.find_all('p', attrs={'class': 'author clearfix'})

然后通过具体到正则表达式来获取信息

for sp in a:
 patten = re.compile(r'<span>(.*?)</span>',re.S)
 Info = re.findall(patten,str(sp))
 lis.append(Info)
 count = count + 1
for mc in ll:
 namePatten = re.compile(r'<h2>(.*?)</h2>', re.S)
 d = re.findall(namePatten, str(mc))
 li.append(d)

我们需要注意的是使用find_all以及re的findall方法返回的都是一个列表,使用正则表达式时我们只是粗略提取并没有把标签中的换行符去掉

接下来我们只需要把2个列表的内容进行组合输出就可以了

def printUnivlist(lis,li,count):
 for i in range(count):
 a = li[i][0]
 b = lis[i][0]
 print ("%s:"%a+"%s"%b)

然后我做一个输入控制函数,输入Q返回错误,退出,输入回车返回正确,进行下一页段子的加载

def input_enter():
 input1 = input()
 if input1 == 'Q':
 return False
 else:
 return True

我们通过主函数来实现所输入的控制,如果控制函数返回的是错误就不执行输出,如果返回的是正确就继续输出。我们通过一个for循环来进行加载下一页。

def main():
 passage = 0
 enable = True
 for i in range(20):
 mc = input_enter()
 if mc==True:
 lit = []
 li = []
 count = 0
 passage = passage + 1
 qbpassage = passage
 print(qbpassage)
 url = 'http://www.qiushibaike.com/8hr/page/' + str(qbpassage) + '/?s=4966318'
 a = getHTMLText(url)
 fillUnivlist(lit, li, a, count)
 number = fillUnivlist(lit, li, a, count)
 printUnivlist(lit, li, number)
 else:
 break

这里我们需要注意到是每一次for循环都会刷新一次lis【】和li【】,这样每次都可以正确输出该网页的段子内容

一下为源代码:

import requests
from bs4 import BeautifulSoup
import bs4
import re
def getHTMLText(url):
 try:
 user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
 headers = {'User-Agent': user_agent}
 r = requests.get(url,headers = headers)
 r.raise_for_status()
 r.encoding = r.apparent_encoding
 return r.text
 except:
 return ""
def fillUnivlist(lis,li,html,count):
 soup = BeautifulSoup(html,"html.parser")
 try:
 a = soup.find_all('p', attrs={'class': 'content'})
 ll = soup.find_all('p', attrs={'class': 'author clearfix'})
 for sp in a:
 patten = re.compile(r'<span>(.*?)</span>',re.S)
 Info = re.findall(patten,str(sp))
 lis.append(Info)
 count = count + 1
 for mc in ll:
 namePatten = re.compile(r'<h2>(.*?)</h2>', re.S)
 d = re.findall(namePatten, str(mc))
 li.append(d)
 except:
 return ""
 return count
def printUnivlist(lis,li,count):
 for i in range(count):
 a = li[i][0]
 b = lis[i][0]
 print ("%s:"%a+"%s"%b)
def input_enter():
 input1 = input()
 if input1 == 'Q':
 return False
 else:
 return True
def main():
 passage = 0
 enable = True
 for i in range(20):
 mc = input_enter()
 if mc==True:
 lit = []
 li = []
 count = 0
 passage = passage + 1
 qbpassage = passage
 print(qbpassage)
 url = 'http://www.qiushibaike.com/8hr/page/' + str(qbpassage) + '/?s=4966318'
 a = getHTMLText(url)
 fillUnivlist(lit, li, a, count)
 number = fillUnivlist(lit, li, a, count)
 printUnivlist(lit, li, number)
 else:
 break
main()

第一次做还是有很多可以优化的地方希望大家可以指出来。

文档

python的爬虫技术爬去糗事百科的的方法详解

python的爬虫技术爬去糗事百科的的方法详解:初次学习爬虫技术,在知乎上看了如何爬去糗事百科的段子,于是打算自己也做一个。实现目标:1,爬取到糗事百科的段子 2,实现每次爬去一个段子,每按一次回车爬取到下一页技术实现:基于python的实现,利用Requests库,re库,bs4库的BeautifulSou
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top