python爬虫爬取百度贴吧中任意贴吧的任意多页的网页内容

一、总体分析

打开百度贴吧,选择进入任意一个贴吧,此处以 “爬虫”贴吧为例。我们可以发现其是一个静态网页,所有的参数都是在URL中出现的。url中?后面的都是参数。

 

 

点开贴吧的第二页,观察URL 的变化(如下图所示),我们可以发现:

       1.少了一个参数“fr=search”,但是此参数写不写对于我们打开网页是不影响的,故我们可以不写此参数,

       2.多了一个参数 “pn=50”,这正是静态网页的奥妙所在,之所以静态网页好爬取,就是因为它的URL变化是有规律的,我们刚好可以借助此规律来组合我们所需要的URL

由此我们可以猜想第三页的URL变化为:https://tieba.baidu.com/f?kw=爬虫&ie=utf-8&pn=150

其实第一页(首页)的url 也是如此,只不过参数“pn=0”,我们可以把第一页(首页)的URL替换成为

https://tieba.baidu.com/f?kw=爬虫&ie=utf-8&pn=0

尝试连接一下,可以发现,此URL打开的正是我们第一页的内容(如下图二所示)

 

(图二)

 

由此我们便找到了URL变化的规律:

1、URL的整体格式为:https://tieba.baidu.com/f?kw=爬虫&pn=0(第一页的URL)

我们把URL中的参数“ie=utf-8”去掉,因为此参数对我们打开我们所需要的网页不影响,大家可以尝试一下。

2、第一页中,URL中的参数pn=0, 每增加一页,URL中的参数pn就增加50,URL中的其他内容不发生改变,pn的规律为:

pn = (page-1)*50

3、观察URL,我们可以发现参数“kw=爬虫”,由此参数“kw”所表示的正是我们所选择进入的贴吧。如果我们选择进入其他的提拔,可以更改URL中的参数“kw”的值,如下图所示:

 

 二、爬取网页

1、模块设计

def loadPage(url,filename)                 作用:根据url发送请求,获取服务器响应文件
def writePage(html,filename)               作用:将html内容写到本地
def tiebaSpider(url, beginPage, endPage)   作用:贴吧爬虫调度器,负责组合处理每个页面的url
if __name__ == "__main__"                  作用:主函数

 

loadPage(url,filename)模块:

def loadPage(url,filename):
    print("正在下载"+filename)
    headers = {
         "User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1"
}
    request = urllib.request.Request(url, headers= headers)
    response = urllib.request.urlopen(request)
    return response.read()

  writePage(html,filename) 模块:

def writePage(html,filename):
    print("正在保存" + filename)
    with open(filename, "wb") as f:
        f.write(html)
    print("-"*30)

tiebaSpider(url, beginPage, endPage) 模块

def tiebaSpider(url, beginPage, endPage):
    for page in range(beginPage ,endPage+1):
        pn = (page-1)*50
        filename = "第" + str(page) +"页.html"
        fullurl = url+"&pn=" + str(pn)
        #print(fullurl)
        html = loadPage(fullurl,filename)
        writePage(html , filename)

if __name__ == "__main__"   模块

可以根据需要,通过kw参数的输入来爬取我们想要爬取的任意贴吧

                          通过起始页和结束页进行for循环来爬取我们想要爬取的任意多页的网页内容

if __name__ == "__main__":
    kw = input("请输入需要爬取的贴吧名:")
    beginPage = int(input("请输入起始页:"))
    endPage = int(input("请输入结束页:"))
    url = "http://tieba.baidu.com/f?"
    key = urllib.parse.urlencode({"kw" : kw})
    fullurl = url + key
    tiebaSpider(fullurl, beginPage, endPage)

2、完整代码:(注:使用的是python3,如果是python2,个别处修改一下即可)

import urllib
import urllib.request

def loadPage(url,filename):
    '''
    作用:根据url发送请求,获取服务器响应文件
    url:需要爬取的url
    filename:处理的文件名
    '''

    print("正在下载"+filename)
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML,like Gecko) Chrome/14.0.835.163 Safari/535.1"
    }
    request = urllib.request.Request(url, headers= headers)
    response = urllib.request.urlopen(request)
    return response.read()

def writePage(html,filename):
    '''
    作用:将html内容写到本地
    html:服务器相应文件内容
    '''

    print("正在保存" + filename)
    with open(filename, "wb") as f:
        f.write(html)
    print("-"*30)


def tiebaSpider(url, beginPage, endPage):
    '''
    作用:贴吧爬虫调度器,负责组合处理每个页面的url
    :param url: 贴吧url的前部分
    :param beginPage:起始页
    :param endPage:结束页
    '''

    for page in range(beginPage ,endPage+1):
        pn = (page-1)*50
        filename = "第" + str(page) +"页.html"
        fullurl = url+"&pn=" + str(pn)
        #print(fullurl)
        html = loadPage(fullurl,filename)
        writePage(html , filename)


if __name__ == "__main__":
    kw = input("请输入需要爬取的贴吧名:")
    beginPage = int(input("请输入起始页:"))
    endPage = int(input("请输入结束页:"))
    url = "http://tieba.baidu.com/f?"
    key = urllib.parse.urlencode({"kw" : kw})
    fullurl = url + key
    tiebaSpider(fullurl, beginPage, endPage)

 

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值