python爬取微博热搜榜
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')
使用完之后要记得关闭资源
此处感谢: https://blog.csdn.net/lyandgh/article/details/81013897
CSDN-Ada助手: 推荐 Java 技能树:https://edu.csdn.net/skill/java?utm_source=AI_act_java
御坂251: # 创建管理员用户 ./kafka-configs.bat --zookeeper localhost:2181 --alter --add-config 'SCRAM-SHA-256=[iterations=8192,password=admin],SCRAM-SHA-512=[password=admin]' --entity-type users --entity-name admin 报错Warning: --zookeeper is deprecated and will be removed in a future version of Kafka. Use --bootstrap-server instead to specify a broker to connect to.
御坂251: # 创建管理员用户 ./kafka-configs.bat --zookeeper localhost:2181 --alter --add-config 'SCRAM-SHA-256=[iterations=8192,password=admin],SCRAM-SHA-512=[password=admin]' --entity-type users --entity-name admin # 创建producer用户 ———————————————— 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 原文链接:https://blog.csdn.net/w269000710/article/details/129572628这一步就错了
码中小白鼠: API: SYSTEM() Time: 08:18:31 UTC 10/05/2023 Error: Read failed. Insufficient number of drives online (*errors.errorString) 8: internal/logger/logger.go:258:logger.LogIf() 7: cmd/prepare-storage.go:254:cmd.connectLoadInitFormats() 6: cmd/prepare-storage.go:312:cmd.waitForFormatErasure() 5: cmd/erasure-server-pool.go:103:cmd.newErasureServerPools() 4: cmd/server-main.go:960:cmd.newObjectLayer() 3: cmd/server-main.go:707:cmd.serverMain.func9() 2: cmd/server-main.go:426:cmd.bootstrapTrace() 1: cmd/server-main.go:705:cmd.serverMain() Waiting for a minimum of 1 drives to come online (elapsed 2m5s)
码中小白鼠: ERROR Unable to validate passed arguments: host in server address should be this server > Please check --address parameter HINT: --address binds to a specific ADDRESS:PORT, ADDRESS can be an IPv4/IPv6 address or hostname (default port is ':9000') Examples: --address ':443' --address '172.16.34.31:9000' --address '[fe80::da00:a6c8:e3ae:ddd7]:9000'