利用python的爬虫技术爬去糗事百科的段子

初次学习爬虫技术,在知乎上看了如何爬去糗事百科的段子,因而打算本身也作一个。html

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

              2,实现每次爬去一个段子,每按一次回车爬取到下一页正则表达式

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

主要内容:首先咱们要理清一下爬取实现的思路,咱们来构建一下主体框架。第一步咱们先写一个利用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")

咱们须要的是段子的内容和发布人,经过网页的查看源代码咱们知道段子的发布人在:url

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

段子的内容在spa

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

第一次作仍是有不少能够优化的地方但愿你们能够指出来。

相关文章
相关标签/搜索