博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
利用python的爬虫技术爬去糗事百科的段子
阅读量:5102 次
发布时间:2019-06-13

本文共 4377 字,大约阅读时间需要 14 分钟。

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

实现目标: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")

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

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

段子的内容在

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

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

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

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

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

(.*?)

', 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('div', attrs={'class': 'content'})         ll = soup.find_all('div', attrs={'class': 'author clearfix'})         for sp in a:             patten = re.compile(r'(.*?)',re.S)             Info = re.findall(patten,str(sp))             lis.append(Info)             count = count + 1         for mc in ll:             namePatten = re.compile(r'

(.*?)

', 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()

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

 
 

 

 
 

转载于:https://www.cnblogs.com/sea-ocean/p/6583089.html

你可能感兴趣的文章
IRT模型的参数估计方法(EM算法和MCMC算法)
查看>>
总账介绍
查看>>
建模各阶段以及相关UML构造笔记
查看>>
MS SQL Server查询优化方法
查看>>
《STL源码剖析》笔记
查看>>
linux命令及实例说明一:cd、ls、rmdir、rm、mkdir
查看>>
一、了解JavaScript
查看>>
出现( linker command failed with exit code 1)错误总结
查看>>
div水平垂直居中的几种方法(面试问题)
查看>>
AutoResetEvent类的使用
查看>>
Django项目中使用Redis
查看>>
stm32之GPIO学习笔记
查看>>
day25,多继承,组合,接口,抽象类和鸭子型
查看>>
Intersection of Two Prisms(AOJ 1313)
查看>>
zero to one (2)
查看>>
DataFrame对比RDD
查看>>
DataFrame和RDD互操作的两种方式:
查看>>
更新浏览器CSS样式表
查看>>
写在2013年最后一天
查看>>
Android目录结构
查看>>