一、总体分析
打开百度贴吧,选择进入任意一个贴吧,此处以 “爬虫”贴吧为例。我们可以发现其是一个静态网页,所有的参数都是在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)