继续上次的话题,这次抓取的网页是天涯论坛中,“地缘看世界”
1、获取网址:通过正则表达式来获取各贴子网址
link='http://www.tianya.cn/publicforum/content/worldlook/1/223829.shtml'
html=urllib2.urlopen(link).read()
m=re.search(r'name=\'idArticleslist\' value=\S*>',html)
IDs=re.findall(r'[0-9]+',m.group(0))
for ID in IDs:
url="http://www.tianya.cn/publicforum/content/worldlook/1/%s.shtml"%ID
2、 下载网页:以前是边下载边处理,这样处理时间长,有时还有下载不了的情况,改为下载到指定目录,并在下载前检查是否存在同名
htmldir=r'.\html\\'
filename=htmldir+url.split('/')[-1]
if (not os.path.exists(filename)) or os.path.getsize(filename)==0:
print 'downloading'+filename+'\n'
html=urlRead(url)
if len(html)>0:
f=open(filename,'w')
f.write(html)
f.close()
3、下载后对网页内容进行分析,在分析前要对网页进行处理以去除htmlparser无法处理的部分,实质是对网页进行截取,并将无法处理字符串替换
txts=re.split(r'<div class="respond" %ID
pool.add_task(getHtml,url,htmldir)
pool.wait_completion()
8、输出到pdf,我使用了reportlab要注意的是:
引用字体:
reportlab.rl_config.warnOnMissingFontGlyphs = 0
pdfmetrics.registerFont(TTFont('YaHei', 'msyh.ttf'))
pdfmetrics.registerFont(TTFont('YaHeiBD', 'msyhbd.ttf'))
fonts.addMapping('YaHei', 0, 0, 'YaHei')
fonts.addMapping('YaHei', 0, 1, 'YaHei')
fonts.addMapping('YaHeiBD', 1, 0, 'YaHeiBD')
fonts.addMapping('YaHeiBD', 1, 1, 'YaHeiBD')
stylesheet=getSampleStyleSheet()
normalStyle = copy.deepcopy(stylesheet['Normal'])
normalStyle.fontName ='YaHei'
其次是中文换行:
normalStyle.wordWrap = 'CJK'
中文的左缩进有bug设置左缩进后,第一行全部向右移,并不是比其他的行前面少几个字
最后是嵌入图片:取得图片的长和宽,然后设置缩放比,
def get_image(path):
width=439
height=685
img = utils.ImageReader(path)
iw, ih = img.getSize()
if iw>width or ih>height:
rw=float(iw)/float(width)
rh=float(ih)/float(height)
if rw>rh:
return Image(path,width,round(ih/rw))
else:
return Image(path,round(iw/rh),height)
else:
return Image(path)
结论:python是处理网页的利器,但我在编码上浪费了许多时间,在htmlparser和re中对中文的编码支持也不好,不知道各达人有没有什么好方法。
python号称是“胶水语言”,但我始终对如何将其与其他诸如C#,java在一起使用感到困惑。
多线程下载还是存在很多问题,各位在借鉴时一定要注意。