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


1. 爬取图片

1.1 前言

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


Python爬虫__爬取贴吧图片和文本_第1张图片

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


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

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


1.3 代码

#coding:utf-8
#---------------------------------
#Created by linxiaobai 2016/09/19
#爬取百度贴吧图片
#---------------------------------
import urllib2
import urllib
import re

#打开贴吧的html
url="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=1
for imurl in imlist:
    print cnt
    print imurl
    urllib.urlretrieve(imurl,"%s.jpg"%cnt);
    cnt+=1

1.4 爬取结果:

Python爬虫__爬取贴吧图片和文本_第2张图片


2. 爬取文本

2.1 前言

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

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

2.2 html格式分析

Python爬虫__爬取贴吧图片和文本_第3张图片

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

Python爬虫__爬取贴吧图片和文本_第4张图片

可以看到每一楼的文本内容都是位于一个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 urllib2
import re
from bs4 import BeautifulSoup
import urlparse

#修改编码
import sys
reload(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("")
fout.write("")
fout.write("")
fout.write("")

for post in res:
    fout.write("

") fout.write(post.get_text())#3)获取到div标签下的文本内容 fout.write("


"
) fout.write("") fout.write("") fout.write("")

2.5 爬取结果

Python爬虫__爬取贴吧图片和文本_第5张图片


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

这里写图片描述


2.6 代码优化

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

#coding:utf-8
#---------------------------------
#Created by linxiaobai 2016/09/21
#爬取百度贴吧的文本内容
#增加爬取用户名
#---------------------------------
import urllib2
import re
from bs4 import BeautifulSoup
import urlparse

#修改编码
import sys
reload(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("")

cnt=1for i in range(len(res_name)):
    fout.write("")
    fout.write(""%str(cnt))
    fout.write(""%res_name[i].get_text())
    fout.write(""%res_post[i].get_text())#3)获取到div标签下的文本内容
    fout.write("")
    cnt+=1

fout.write("
%s%s%s
")



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

Python爬虫__爬取贴吧图片和文本_第6张图片

你可能感兴趣的:(Web)