Python爬虫__爬取贴吧图片和文本

来源:互联网 发布:联想淘宝商城旗舰店 编辑:程序博客网 时间:2024/04/30 05:27

1. 爬取图片

1.1 前言

这是一个李清照吧http://tieba.baidu.com/p/3825973883
里面有楼主上传的书法作品,每一楼的格式大致是这样,文本加上书法图片:


这里写图片描述

我当年年少,还不知道爬虫这个东西,又想把书法图片保存下来,于是一张张地把图片另存为,现在用爬虫来爬取每一楼的书法图片,解放一下人力:


1.2 爬取图片的流程可以总结如下:

1)爬取网页的html代码;
2)提取其中的图片url;
3)下载图片到本地。


1.3 代码

#coding:utf-8#---------------------------------#Created by linxiaobai 2016/09/19#爬取百度贴吧图片#---------------------------------import urllib2import urllibimport re#打开贴吧的htmlurl="http://tieba.baidu.com/p/3825973883"response=urllib2.urlopen(url)html=response.read()#提取其中所有的图片url(使用正则)reg=r'src="(http://imgsrc.*?\.jpg)"'imgre=re.compile(reg)imlist=re.findall(reg,html)#下载图片到本地cnt=1for imurl in imlist:    print cnt    print imurl    urllib.urlretrieve(imurl,"%s.jpg"%cnt);    cnt+=1

1.4 爬取结果:

这里写图片描述


2. 爬取文本

2.1 前言

http://tieba.baidu.com/p/584926093
此楼的标题是“谁来说说李清照和纳兰容若这两人”,大致就是粉丝对两位词人的比较,比较有意思的是,吧主怕易安粉和容若粉打起来,还特意出来声明“我早就说过禁止对词人进行比较”云云……

我们要做的工作就是把每一楼发表的文本提取出来。

2.2 html格式分析

这里写图片描述

这是楼主发表的文本,html格式如下,并且其他各楼的格式也都与此一致:

这里写图片描述

可以看到每一楼的文本内容都是位于一个div中,而div的classs属性是唯一的,因此,可以利用class属性定位到文本的div。

res=soup.find_all('div',class_="d_post_content j_d_post_content ")

进一步,可以使用get_text()函数获取div中的文本。


2.3 步骤梳理

综上,可以总结出如下步骤:
1)爬取贴吧html内容;
2)获取文本所在的div(使用BeautifulSoup);
3)获取div中的文本


2.4 代码

#coding:utf-8#---------------------------------#Created by linxiaobai 2016/09/21#爬取百度贴吧的文本内容#---------------------------------import urllib2import refrom bs4 import BeautifulSoupimport urlparse#修改编码import sysreload(sys)sys.setdefaultencoding('utf-8')#1)爬取贴吧html内容html_con=urllib2.urlopen("http://tieba.baidu.com/p/584926093").read()#2)获取文本所在的div(使用BeautifulSoup);soup=BeautifulSoup(html_con,'html.parser',from_encoding='utf-8')res=soup.find_all('div',class_="d_post_content j_d_post_content ")#写入文件,写入的标签纯属格式需要,可以忽略fout=open("lqz.html",'w')fout.write("<html>")fout.write("<head>")fout.write("<meta charset='utf-8'/>")fout.write("<body>")for post in res:    fout.write("<p>")    fout.write(post.get_text())#3)获取到div标签下的文本内容    fout.write("</p><br/>")fout.write("</body>")fout.write("</head>")fout.write("</html>")

2.5 爬取结果

这里写图片描述


寻找一下吧主害怕民众打架,发出的警告:

这里写图片描述


2.6 代码优化

其实也谈不上优化,因为还没有化成oo形式,只是缩短了代码的长度,另外,增加爬取用户名字,结果输出到列表中。

#coding:utf-8#---------------------------------#Created by linxiaobai 2016/09/21#爬取百度贴吧的文本内容#增加爬取用户名#---------------------------------import urllib2import refrom bs4 import BeautifulSoupimport urlparse#修改编码import sysreload(sys)sys.setdefaultencoding('utf-8')#1)爬取贴吧html内容html_con=urllib2.urlopen("http://tieba.baidu.com/p/584926093").read()#2)获取文本所在的div(使用BeautifulSoup);soup=BeautifulSoup(html_con,'html.parser',from_encoding='utf-8')res_name=soup.find_all('li',class_="d_name")res_post=soup.find_all('div',class_='d_post_content j_d_post_content ')#写入文件,写入的标签纯属格式需要,可以忽略fout=open("lqz.html",'w')fout.write("<html><head><meta charset='utf-8'/><body><table>")cnt=1for i in range(len(res_name)):    fout.write("<tr>")    fout.write("<td>%s</td>"%str(cnt))    fout.write("<td>%s</td>"%res_name[i].get_text())    fout.write("<td>%s</td>"%res_post[i].get_text())#3)获取到div标签下的文本内容    fout.write("</tr>")    cnt+=1fout.write("<table></body></head></html>")



输出结果。每一行的内容,从左到右依次是:序号,用户名,用户发表的文本:

这里写图片描述

2 0
原创粉丝点击