Python+正则表达式编写多线程百度贴吧网页爬虫

其实本来是想做一个利用Python+XPath的贴吧爬虫,但是遇到了一些很奇怪的问题搞了一天也没有解决,所以只有用简单的正则表达式来代替XPath。
这个小爬虫是用于爬取一个帖子所有的回帖人+回帖内容+回帖时间,并导出到本地的文件中保存。本次测试的贴吧地址为:https://tieba.baidu.com/p/3905531791?pn中1-5页的所有内容。
利用多线程可以大大提高爬虫爬取速度,提高程序的效率。
因为百度贴吧的网页源码随时可能会改动,源码改动可能会导致正则表达式匹配不到正确的结果,所以这个爬虫具有一定的时效性。爬虫代码是根据最新的贴吧网页源码制作,若有变更,请读者自行修改。

# -*- coding:utf-8 -*-
from multiprocessing.dummy import Pool as ThreadPool
import requests
import re
import sys
reload(sys)
sys.setdefaultencoding('utf-8')

def write(content):  #将数据保存至本地文件中
    f.writelines(u'回帖人:'+str(content['user_name'])+'\n')
    f.writelines(u'回帖时间:'+str(content['reply_time'])+'\n')
    f.writelines(u'回帖内容:'+unicode(content['content'])+'\n'+'\n')

def spider_Re(url):    #利用正则表达式匹配提取网页信息
    html = requests.get(url)
    content_field = re.findall('
    (.*?)
    for each in content_field: author = re.search('target="_blank">(.*?)',each,re.S).group(1) content = re.search('class="d_post_content j_d_post_content ">(.*?)

    ',each,re.S).group(1).replace('
    '
    ,'\n') reply_time = re.search('''[^/a>](.*?)
''',each,re.S).group(1) print content print author print reply_time item['user_name'] = author item['content'] = content item['reply_time'] = reply_time write(item) if __name__ == '__main__': pool = ThreadPool(4) #参数取决于CPU的核心数 f = open('content.txt','w') page=[] for i in range(1,6): #1到总页数+1 newpage = 'https://tieba.baidu.com/p/3905531791?pn=' + str(i) page.append(newpage) results = pool.map(spider_Re,page) pool.close() pool.join() f.close()

这样基本就可以完成贴吧网页的爬取了。
如:

回帖人:jin70908469
回帖内容:            游戏背景
职业介绍
巫师系列剧情讲解视频
巫师前作故事梗概
攻略心得,有些可能含有本作剧透,慎入!
官方英文版攻略PDF 
影响结局的选项
纯堆DPS加点
法印流加点
三种流派的主要人物加点和培养<a href="http://jump2.bdimg.com/safecheck/index?url=x+Z5mMbGPAs95UolpNuq+CwM2BpViN6QF0BYrUCVRu8ACvHfW52JIJiw9jD7zZ68yExmB9N/65I="  target="_blank">http://tieba.baidu.com/p/3787258057a>
全地图技能点收集(魔力之所)<a href="http://jump2.bdimg.com/safecheck/index?url=x+Z5mMbGPAs95UolpNuq+CwM2BpViN6QF0BYrUCVRu9mNjDqZl39tlDLvtcpYTbcyExmB9N/65I="  target="_blank">http://tieba.baidu.com/p/3787534924a>
所有魔力之所,昆特牌玩家和销售卡牌的旅行者的位置<a href="http://jump2.bdimg.com/safecheck/index?url=x+Z5mMbGPAs95UolpNuq+CwM2BpViN6QF0BYrUCVRu9OnJoDv3V75Ppbi42L2g7XITkBmfiS/WpWpoifrx0i/9hNVf7JU91BgLHy2pejPhpWpoifrx0i/7Cj68W1k+ZNAG+4Cm4FSU0="  target="_blank">http://tieba.baidu.com/p/3790700051?pid=69022101270&cid=0#69022101270
昆特牌全面解析<a href="http://jump2.bdimg.com/safecheck/index?url=x+Z5mMbGPAs95UolpNuq+CwM2BpViN6QF0BYrUCVRu8HXtSL9TnUr8YC6GYK0gQGyExmB9N/65I="  target="_blank">http://tieba.baidu.com/p/3806546863a>
所有昆特牌收集<a href="http://jump2.bdimg.com/safecheck/index?url=x+Z5mMbGPAs95UolpNuq+CwM2BpViN6QF0BYrUCVRu/f6TYTK+5+oR33i2kCddzcyExmB9N/65I="  target="_blank">http://tieba.baidu.com/p/3794649067a>

仔细地看爬取出的文件信息就可以发现,回帖内容中会出现大量的类似于
http://.......之类的标签内容,非常影响观感。
于是我尝试使用正则表达式清除这类标签信息,保留超链接标签中的文字。
添加下列代码:

    content = re.sub('''''', '', content, re.S).replace('', '') #匹配删除标签
    content = re.sub('''''','',content,re.S)  #匹配删除标签

这样大部分的标签就可以被删除:(有少部分还是删不掉不知道什么原因,请大神留言解答)

回帖人:jin70908469
回帖时间:2015-07-19 17:48
回帖内容:            游戏背景
12代的游戏资源这里就不提供了,有意者可到相应贴吧或各大游戏网站自行寻找。
不想玩前作或是没时间的吧友可阅读以下背景介绍。
机核网制作的猎魔人系列背景介绍http://www.g-cores.com/witcher#charactor
“猎魔人”系列的前世今生http://tieba.baidu.com/p/2167716421
猎魔人的世界[小说剧透] http://tieba.baidu.com/p/3109151723
狩魔猎人职业介绍http://tieba.baidu.com/p/3710504558
巫师系列剧情讲解视频http://tieba.baidu.com/p/3693416865
巫师前作故事梗概http://tieba.baidu.com/p/3736572554

攻略心得,有些可能含有本作剧透,慎入!
官方英文版攻略PDF http://pan.baidu.com/s/1jGgT706
影响结局的选项http://tieba.baidu.com/p/3821337556
纯堆DPS加点http://tieba.baidu.com/p/3784395921
法印流加点http://tieba.baidu.com/p/3793006353
三种流派的主要人物加点和培养http://tieba.baidu.com/p/3787258057
全地图技能点收集(魔力之所)http://tieba.baidu.com/p/3787534924
所有魔力之所,昆特牌玩家和销售卡牌的旅行者的位置http://tieba.baidu.com/p/3790700051?pid=69022101270&;cid=0#69022101270
昆特牌全面解析http://tieba.baidu.com/p/3806546863
所有昆特牌收集http://tieba.baidu.com/p/3794649067
TW3在线官方地图 http://thewitcher.com/map

关于XPath版本的贴吧爬虫我会找机会再研究研究,成功后再发表分享。

你可能感兴趣的:(python爬虫,python学习笔记)