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

实现目标: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'<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('div', attrs={'class': 'content'})
ll = soup.find_all('div', 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的爬虫技术爬去糗事百科的段子的更多相关文章

  1. python网络爬虫--简单爬取糗事百科

    刚开始学习python爬虫,写了一个简单python程序爬取糗事百科. 具体步骤是这样的:首先查看糗事百科的url:http://www.qiushibaike.com/8hr/page/2/?s=4 ...

  2. 利用python的爬虫技术爬取百度贴吧的帖子

    在爬取糗事百科的段子后,我又在知乎上找了一个爬取百度贴吧帖子的实例,为了巩固提升已掌握的爬虫知识,于是我打算自己也做一个. 实现目标:1,爬取楼主所发的帖子 2,显示所爬去的楼层以及帖子题目 3,将爬 ...

  3. [爬虫]用python的requests模块爬取糗事百科段子

    虽然Python的标准库中 urllib2 模块已经包含了平常我们使用的大多数功能,但是它的 API 使用起来让人感觉不太好,而 Requests 自称 “HTTP for Humans”,说明使用更 ...

  4. python爬虫之爬取糗事百科并将爬取内容保存至Excel中

    本篇博文为使用python爬虫爬取糗事百科content并将爬取内容存入excel中保存·. 实验环境:Windows10   代码编辑工具:pycharm 使用selenium(自动化测试工具)+p ...

  5. 爬取糗事百科热门段子的数据并保存到本地,xpath的使用

    和之前的爬虫类博客的爬取思路基本一致: 构造url_list,因为糗事百科的热门栏目默认是13页,所以这个就简单了 遍历发送请求获取响应 提取数据,这里用的是xpath提取,用的是Python的第三方 ...

  6. python爬虫——利用BeautifulSoup4爬取糗事百科的段子

    import requests from bs4 import BeautifulSoup as bs #获取单个页面的源代码网页 def gethtml(pagenum): url = 'http: ...

  7. Python爬虫:爬取糗事百科

    网上看到的教程,但是是用正则表达式写的,并不能运行,后面我就用xpath改了,然后重新写了逻辑,并且使用了双线程,也算是原创了吧#!/usr/bin/python# -*- encoding:utf- ...

  8. python学习(十六)写爬虫爬取糗事百科段子

    原文链接:爬取糗事百科段子 利用前面学到的文件.正则表达式.urllib的知识,综合运用,爬取糗事百科的段子先用urllib库获取糗事百科热帖第一页的数据.并打开文件进行保存,正好可以熟悉一下之前学过 ...

  9. Python爬虫实战之爬取糗事百科段子【华为云技术分享】

    首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把,这次我们尝试一下用爬虫把他们抓取下来. 友情提示 糗事百科在前一段时间进行了改版,导致之前的代码没法用了,会导致无法输出和CPU占用过高的 ...

随机推荐

  1. MVC View显示详解(RenderBody,RenderPage,RenderSection,Partial)

    一.Views文件夹 -> Shared文件夹下的 _Layout.cshtml 母版页 @RenderBody 当创建基于_Layout.cshtml布局页面的视图时,视图的内容会和布局页面合 ...

  2. Android安卓身份证识别SDK

    一.Android安卓身份证识别SDK应用背景 这些年,随着互联网金融的极速发展,第三方支付.理财.P2P网贷.征信等APP应用成爆发式的增长,在众多APP中都涉及到对身份证信息的录入,如第三方支付. ...

  3. android开发过程中踩过的坑

    1) 4.X下 viewgroup 不一定会向下传递requestLayout,当onlayout的速度比较慢(比如子View比较复杂之类的原因),系统会跳帧!此时子View下层的view可能就不会再 ...

  4. Java编程规范(一)

    最近在看一本有关Java编程规范的书,书中精炼阐述了使用java语言时应该遵循的一些原则.接下来的一段时间我将在这里总结我的学习内容,也希望这一系列文章能够对有需要的人有所帮助. 不考虑任何编码规范的 ...

  5. C#委托简介

    C#中委托是一种引用类型,该引用类型与其他引用类型不同,在委托对象的引用中存放的不是对数据的引用而是存放对方法的引用,即委托的内部包含一个指向某个方法的指针.通过使用委托把方法的引用封装在委托对象中, ...

  6. Java丨博客系统

    后台界面: 前台界面: 这是一个由我带着刚入门的几位实习生做的一个博客系统,希望给java入门的学习者一个例子,这个系统还需要完善,主体功能是实现了,还差一些细节,如果需要源码的话可以在下方给我留言! ...

  7. Padding Borders Outlines Margins

    简介: 在20世纪90年代,许多网页布局是使用table,使用table最主要的原因是因为可以放text到一个盒子里,但是这是一个比较复杂的过程,现在可以使用比较简单的方法,那就是css. 元素盒子: ...

  8. AntData.ORM框架 之DBModel CodeGen如何使用

    AntData.ORM 框架 开源地址:https://github.com/yuzd/AntData.ORM 打开VS2015 打开Tools =>Extentions and Updates ...

  9. margin:0 auto;不居中?

    1.没有设置宽度 <div style="margin:0 auto;"></div> 看看上面的代码,根本没有设置DIV的宽度,如何根据宽度自适应呢?新手 ...

  10. Java Web(三) 会话机制,Cookie和Session详解

    很大一部分应该知道什么是会话机制,也能说的出几句,我也大概了解一点,但是学了之后几天不用,立马忘的一干二净,原因可能是没能好好理解这两种会话机制,所以会一直遗忘,一直重新回过头来学习它,今天好好把他总 ...