您的位置:首页 > 移动开发 > 微信开发

爬取微信文章的小代码写入一个本地网页时需要注意声明html文档编码

2018-06-09 14:02 489 查看
<meta http-equiv="content-type" content="txt/html; charset=utf-8" />

写入一个新的html页时一定要在head标签里加上声明文档编码,不然简体字乱码

import urllib.request

import re

import ssl

ssl._create_default_https_context = ssl._create_unverified_context

# 模拟成浏览器

headers=("User-Agent","Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:60.0) Gecko/20100101 Firefox/60.0")

opener = urllib.request.build_opener()

opener.addheaders = [headers]

# 将opener安装为全局

urllib.request.install_opener(opener)

listurl = []

def getlisturl(key,pagestart,pageend):

page=pagestart

# 编码关键词key

keycode = urllib.request.quote(key)

# 编码“&page”

pagecode = urllib.request.quote("&page")

# 循环爬取各页的文章链接

for page in range(pagestart,pageend+1):

# 分别构建各页的url链接,每次循环构建一次

url="http://weixin.sogou.com/weixin?type=2&query="+keycode+pagecode+str(page)

# 使用代理服务器爬取,解决IP被封杀问题

data1 = urllib.request.urlopen(url).read().decode('utf-8')

# 获取文章链接的正则表达式

listurlpat = '<div class="txt-box">.*?(http://.*?)"'

# 获取每页的所有文章链接并添加到列表listurl中

listurl.append(re.compile(listurlpat,re.S).findall(data1))

print("共获取到:"+str(len(listurl))+"页") #便于调试

return listurl

# 通过文章链接获取对应内容

def getcontent(listurl):

i = 0

# 设置本地文件中的开始html编码

html1 = '''<!DOCTYPE html><html><head><meta http-equiv="content-type" content="txt/html; charset=utf-8" /><title>微信文章页面</title></head><body>'''

fh = open("/Users/leilei/Desktop/python_pdf/handget/1.html","wb")

fh.write(html1.encode('utf-8'))

fh.close()

# 再次以追加写入的方式打开文件,以写入对应文章内容

fh = open("/Users/leilei/Desktop/python_pdf/handget/1.html","ab")

# 此时listurl为二维列表形如listurl[][],第一维存储的信息跟第几页相关,第二维存的跟该页第几个文章链接相关

for i in range(0,len(listurl)):

for j in range(0,len(listurl[i])):

url=listurl[i][j]

# 处理成真是url,读者亦可以观察对应网址的关系自行分析,采集网址比真是网址多了一串amp

url=url.replace("amp;","")

# 使用代理去爬取对应网址的内容

data = urllib.request.urlopen(url).read().decode('utf-8')

# 文章标题正则表达式

titlepat="<title>(.*?)</title>"

# 文章内容正则表达式

contentpat = 'id="js_content">(.*?)id="js_sg_bar"'

# 通过对应的正则表达式找到标题并赋给列表title

title = re.compile(titlepat).findall(data)

# 通过对应正则表达式好到内容并赋给列表content

content = re.compile(contentpat,re.S).findall(data)

# 初始化标题与内容

thistitle = "此次没有获取到"

thiscontent="此次没有获取到"

# 如果标题列表不为空,说明找到了标题,去列表第零个元素,即此次标题赋给变量thistitle

if(title!=[]):

thistitle = title[0]

if(content!=[]):

thiscontent=content[0]

# 将标题与内容汇总赋给变量dataall

dataall = "<p>标题为:"+thistitle+"</p><p>内容为:"+thiscontent+"</p><br>"

# 将该篇文章的标题与内容的总信息写入对应文件

fh.write(dataall.encode('utf-8'))

fh.close()

# 设置并写入本地文件的html后面结束部分代码

html2='''</body></html>'''

fh = open("/Users/leilei/Desktop/python_pdf/handget/1.html","ab")

fh.write(html2.encode("utf-8"))

fh.close()

print("Succes")

# 设置关键词

key = "物联网"

# 起始页

pagestart=1

# 爬取到那页

pageend=2

getlisturl(key,pagestart,pageend)

getcontent(listurl)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐