python网络爬虫简明手册2

4 百度贴吧小爬虫

首先我们创建一个python文件, tieba_spider.py

我们要完成的是,输入一个百度贴吧的地址,比如

这个是lol吧的第一页的url地址,如果打开第二页,你会发现他的url如下:

第二页:

第三页:

发现规律了吧,贴吧中每个页面不同,url出来最后的pn的值,其余的都是一样的,我们可以

抓住这个规律

简单写一个小爬虫程序,来爬取百度LOL吧的所有网页。

上一节我们已经写出一个爬取一个网页的代码。

现在,我们将它封装成一个小函数load_page,供我们使用。

def load_page(url):

'''

@brief 通过URL请求爬取到html静态页面源代码

@param url 要爬取的url地址

@returns

源代码

'''

req = urllib2.Request(url)

response = urllib2.urlopen(req)

html = response.read()

return html

接下来,我们写一个百度贴吧爬虫接口,我们需要传递3个参数给这个接口,一个是我们要爬取的url地址,和要爬取页码的范围。

所有学员享受免费、不限次数、无限重学的权利直到学会为止,拒绝限制次数、缴纳重学费的恶心规矩。

def tieba_spider(url, begin_page, end_page):

'''

@brief 百度贴吧爬虫核心程序

@param url 要爬取的url地址

@param begin_page 爬虫贴吧的起始页数

@param end_page 爬虫贴吧的终止页数

'''

user_agent = 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT

6.1; Trident/5.0;' #IE 9.0

headers = {'User-Agent':user_agent}

for i in range(begin_page, end_page+1):

#根据百度贴吧的url中的页码pn规律

# 当你打开第一页 pn = 0

# 当你打开第二页 pn = 50

# 当你打开第三页 pn = 100

# 当你打开第四页 pn = 150 -0

# ....

# 所以 pn = 50* (page-1)

pn = 50 * (i - 1)

html = load_page(url+str(pn))

最后如果我们希望将爬取到了每页的信息存储在本地磁盘上,我们可以简单写一个存储文件

的接口。

def write_file(file_name, text):

'''

@brief 将字符串内容写到文件中

@param file_name 文件路径

@param text 要写进的字符串

'''

print '正在存储文件' + file_name

f = open(file_name, 'w+')

f.write(text)

f.close()

ok,接下来就是写一个main函数吧,然后提示用户输入即将爬取的百度贴吧url地址。

( 注意 :百度贴吧最后页码” pn=??? “中的 ??? 为我们传入的页码参数,所以我们再提供的

时候不能包括 ??? )

if __name__ == '__main__':

bdurl = str(raw_input('请输入贴吧的地址, 去掉pn=后面的数字:'))

begin_page = int(raw_input('请输入开始的页数'))

end_page = int(raw_input('请输入结束的页数'))

tieba_spider(bdurl, begin_page, end_page)

综上, 全部完整代码应该如下:

# -*- coding: utf-8 -*-

#-------------------------

# 百度贴吧小爬虫

# 作者:无崖子

# 日期:2016-3-2

# sys: mac os

# python 2.7.6

# os: mac

#-------------------------

import urllib2

def write_file(file_name, text):

'''

@brief 将字符串内容写到文件中

@param file_name 文件路径

@param text 要写进的字符串

'''

print '正在存储文件' + file_name

f = open(file_name, 'w+')

f.write(text)

f.close()

def load_page(url):

'''

@brief 通过URL请求爬取到html静态页面源代码

@param url 要爬取的url地址

@returns

源代码

'''

req = urllib2.Request(url)

response = urllib2.urlopen(req)

html = response.read()

return html

def tieba_spider(url, begin_page, end_page):

'''

@brief 百度贴吧爬虫核心程序

@param url 要爬取的url地址

@param begin_page 爬虫贴吧的起始页数

@param end_page 爬虫贴吧的终止页数

'''

user_agent = 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT

6.1; Trident/5.0;' #IE 9.0

headers = {'User-Agent':user_agent}

for i in range(begin_page, end_page+1):

#根据百度贴吧的url中的页码pn规律

# 当你打开第一页 pn = 0

# 当你打开第二页 pn = 50

# 当你打开第三页 pn = 100

# 当你打开第四页 pn = 150 -0

# ....

# 所以 pn = 50* (page-1)

pn = 50 * (i - 1)

html = load_page(url+str(pn))

file_name = str(i) +'.html'

print '正在下载第' + str(i) + '个网页'

write_file(file_name, html)

if __name__ == '__main__':

bdurl = str(raw_input('请输入贴吧的地址, 去掉pn=后面的数字:'))

begin_page = int(raw_input('请输入开始的页数'))

end_page = int(raw_input('请输入结束的页数'))

tieba_spider(bdurl, begin_page, end_page)

好了,最后我们测试一下,咱们的小爬虫。

( 注意=号后面不要加数字,因为我们要自动添加 )

ocalhost:spider ldb$ python tieba_spider.py

tf-8&pn=

请输入开始的页数5

请输入结束的页数10

正在下载第5个网页

正在存储文件5.html

正在下载第6个网页

正在存储文件6.html

正在下载第7个网页

正在存储文件7.html

正在下载第8个网页

正在存储文件8.html

正在下载第9个网页

正在存储文件9.html

正在下载第10个网页

正在存储文件10.html

最后会发现当前路径下会有几个html页面,分别对应贴吧中对应的网页。

这样一个简单的爬虫程序就搞定了。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180608A08TML00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券