python爬取微博热搜榜
最近应我大学室友得需求,做了一个简单的爬虫案例,先给大家看一下程序运行效果
接下来就是贴出代码了,在这里我会做一些简单说明,对如刚入门的同学可能会有所帮助,这里使用的是python3
-
需要引入的包,这两个包可能需要自行下载
urllib lxml
-
代码
import urllib.request #导入urllib.request库 import urllib.parse from lxml import etree #b = str(input("请输入:")) #提示用户输入信息,并强制类型转换为字符串型 def weibo() : url = 'https://s.weibo.com/top/summary?' a = urllib.request.urlopen(url) #打开指定网址 html = a.read() #读取网页源码 html = html.decode("utf-8") #解码为unicode码 # print(html) #打印网页源码 tree = etree.HTML(html) list = tree.xpath(u'//*[@id="pl_top_realtimehot"]/table/tbody/tr/td[@class="td-02"]') prefix = 'https://s.weibo.com' # 微博域名 weiboSummary = open("微博热搜.txt", 'w') #打开并写入文件 for index,item in enumerate(list): if index > 0: a_element = item.xpath('.//a')[0] title = a_element.text # 关键词 href = urllib.parse.unquote(a_element.attrib.get('href')) # 链接 href = href.replace("#", "%23") #此处是对链接中的#号做一个编码转换,否则无法跳转指定关键词链接 hot = item.xpath('./span')[0].text #热度指数 line = str(index) + "\t" + title + "\t" + hot + "\t" + prefix + href + "\n" print(line.replace("\n", "")) if href.find("javascript:void(0)") != -1: line = str(index) + "\t" + title + "\t" + hot #写入文件 weiboSummary.write(line) else: title = '排名\t关键词\t热度\t链接\n' print(title.replace("\n","")) weiboSummary.write(title) weiboSummary.close() #调用方法 weibo();
-
遇到的问题
1).这是本文中关于lxml的一些简单用法
代码中的
etree.HTML(html)
是获取页面源码对象获取到节点对象以后可以使用
xpath()
来获取元素内容,此处可以使用下图中的方法,注意
:该方法类似于JQuery的类选择器,如果按xpath('//a')
这种写法,获取的是页面中所有的a标签。u
代表的是编码方式element = tree.xpath(u'//*[@id="pl_top_realtimehot"]/table/tbody/tr/td[@class="td-02"]')
element.text
获取的是当前对象标签中的文本属性的话我们可以通过
element.attrib.get('标签中的属性名')
这种方式获取标签属性的内容详细的lxml文档操作可以自行百度
2). 关于IO我在使用python的IO操作时候遇到一些问题
具体的错误原因我还尚不明确,不过导致报错的原因是因为我导入了 IO 的包,python中本身带有IO操作的相关API
我们只需要直接调用就可以
例如:open('weibo.txt', 'w')
不需要使用os.open('weibo.txt')
使用完之后要记得关闭资源