• 技术文章 >后端开发 >Python教程

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

    高洛峰高洛峰2017-03-20 09:25:32原创730
    初次学习爬虫技术,在知乎上看了如何爬去糗事百科的段子,于是打算自己也做一个。

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

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

    php入门到就业线上直播课:查看学习

    以上就是python的爬虫技术爬去糗事百科的的方法详解的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。

    前端(VUE)零基础到就业课程:点击学习

    清晰的学习路线+老师随时辅导答疑

    自己动手写 PHP MVC 框架:点击学习

    快速了解MVC架构、了解框架底层运行原理

    专题推荐:python爬虫
    上一篇:使用Python执行时间的计算三种方法代码 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • ❤️‍🔥共22门课程,总价3725元,会员免费学• ❤️‍🔥接口自动化测试不想写代码?• Python NumPy教程之数据类型对象• 使用Python处理KNN分类算法• Python标准库中的logging用法示例• python发腾讯微博代码分享• python自动化测试实例解析
    1/1

    PHP中文网