前言
python爬虫方面的内容大部分都是在学姐的指导下参考着崔庆才的博客写的,这次的任务是爬取一整个贴吧,并写出一个通用的代码来。参考了崔庆才的爬取帖子的博客,可以先看看里面的内容,讲解的比较详细清楚
附上传送门http://cuiqingcai.com/993.html
任务目标
1、爬取下来整个贴吧,例如无双剑姬吧的所有帖子和帖子楼层里的内容(不包括回复)
2、写出通用的代码,可以简单的实现爬取别的贴吧
大体思路
大体上分为两个部分,贴吧部分和帖子部分,这是两个链接类型,在贴吧部分我们需要实现的是找到每个帖子的地址链接,在帖子部分我们需要做的就是将我门需要的内容爬取下来
1、从贴吧的源代码中实现找到每个帖子的地址
首先观察贴吧url:
http://tieba.baidu.com/f?kw=%CE%DE%CB%AB%BD%A3%BC%A7&fr=ala0&tpl=5
这是无双剑姬吧首页的url,好像看不出啥,中间一大堆乱码的,再来看看第二页的:
由于编码问题,浏览器中间部分复制地址的时候是乱码的,其实换成utf-8格式的话就是贴吧名字
然后观察每个帖子的url,随便打开几个帖子观察有什么规律:
http://tieba.baidu.com/p/4892424536
http://tieba.baidu.com/p/4900001683
http://tieba.baidu.com/p/2842025455
观察可以看出来帖子之间url的去别应该是没个帖子都有一个特殊的代号例如4892424536 ,换个贴吧也是一样的。接下来就可以在源码中把我们要用的爬取下来。
在这里需要注意的是,检查元素和查看页面源代码中看到的是有点不一样的,比如这次的,第一个是源代码,第二个是检查元素,两个写出来的正则肯定有点不一样,第二种虽然方便,但是不一定能匹配到,写的爬虫中获取的网页是源代码,跟第一个一样的,所以我们写正则的时候要按照源代码来写。
pattern = re.compile('<a href="/p/(\w*)" title="', re.S)
可以写一个简单的函数测试下
# -*- coding:utf-8 -*-
import urllib
import urllib2
import re
from bs4 import BeautifulSoup
url ='http://tieba.baidu.com' + '/f?kw='+'无双剑姬' + '&ie=utf-8&pn=&pn='
request = urllib2.Request(url)
response = urllib2.urlopen(request).read()
pattern = re.compile('<a href="/p/(\w*)" title="', re.S)
items = re.findall(pattern, response)
contents = []
for item in items:
contents.append(item.encode('utf-8'))
print contents
D:\Python2.7\python.exe C:/Users/jin/PycharmProjects/untitled/BaiDuTieBa/ceshi.py
['4810437627', '4357309014', '2699923439', '4904565298', '4858937315', '4904688967', '4897517850', '4904352257', '4896960759', '4836534322', '4850953681', '4866690931', '4901108246', '4683227974', '4904509220', '4883021415', '4903211842', '4901679966', '4904161919', '4898409493', '4904421801', '4898097487', '4904147219', '4904529036', '4716566198', '4883884875', '4892708618', '4872615105', '4899990434', '4880760823', '4879886617', '4903176679', '4904143329', '4899405760', '4901463405', '3606442233', '4897567192', '4737113765', '4730786446', '4902945899', '4903761601', '4873677499', '4712812826