ulrlib案例-爬取百度贴吧

1.任务需求

百度贴吧有很多主题,每个主题下的网页存在很多分页。爬取不同的主题,并下载每个主题下的多页网页。

输入贴吧名称,下载相应贴吧的多页网页,设置最多下载50页。

2.分析网页

访问不同的百度贴吧时。尝试搜索多个贴吧,观察到浏览器的url中的kw为贴吧的名称。

因此,发送get请求时,设置不同的kw可以访问不同的贴吧。

同一主题的贴吧中,有分页,通过点击不同的分页,可以看出,url中的pn规律变化

  第1页 pn = 0

  第2页 pn=50

  第3页 pn=100

据此规律可以爬取不同页数的网页。

3.代码实现

 1 from urllib import request,parse
 2 import time
 3 import random
 4 import os
 5 
 6 kw = input('请输入贴吧名称:')
 7 start = input('请输入起始页:')
 8 end = input('请输入结束页:')
 9 
10 # 构建请求字符串
11 qs = {
12   'kw':kw
13 }
14 qs = parse.urlencode(qs)
15 
16 # 构建贴吧链接地址
17 base_url = 'https://tieba.baidu.com/f?' + qs
18 
19 start = (int(start) - 1) * 50
20 end = (int(end) - 1) * 50 + 1
21 
22 for pn in range(start,end,50):
23   # pn 分页数字
24   # 文件名
25   fname = str((pn//50 + 1)) + '.html'
26   fullurl = base_url + '&pn=' + str(pn)
27   print(fullurl)
28   response = request.urlopen(fullurl)
29   data = response.read().decode('utf-8')
30 
31   # 自动创建目录
32   path = './tieba/' + kw
33   if not os.path.exists(path):
34   os.makedirs(path)
35 
36   with open(os.path.join(path,fname),'w',encoding='utf-8') as f:
37     f.write(data)
38 
39   # 加入请求间隔
40   time.sleep(random.random() * 2)

4.注意事项

后面的加入随机请求间隔,防止请求过于频繁导致被封IP。

 

posted @ 2018-07-06 23:04  doitjust  阅读(257)  评论(0编辑  收藏  举报