微博爬虫记录
写这个主要是为了防止自己忘记以及之后的组内工作交接,至于代码美不美观,写的好不好,统统不考虑,我只能说,能跑就不错了,上学压根没学过python好吧,基本上是crtl+c&ctrl+v丝滑小连招教会了我一点。
写的很简单,认真看完就会用了
文中筛选元素用到的一些筛选元素的正则匹配、beautifulsoup,css等相关方法我也不太懂,现学现用呗,还是那句话,能跑就行。
配置简介:
python3.6、selenium3.13.0,chorme以及与chorme版本对应的chormedriver
(selenium在4版本后的一些语句会需要修改,网上一大把自己查)
目录
1、启动程序控制的chorme,手动登录微博
2、在微博进行关键词的检索
3、微博的发布信息获取
4、保存数据
5、实现自动翻页
6、微博的评论信息获取
1、先启动一个由程序控制的chorme
(1)win+R,输入cmd打开命令行,输入代码进入chorme的安装位置
C:Program FilesGoogleChromeApplication
(2)分配chorme的端口号(我这里设置的是9527)和数据目录(我这里是在D:seleniumAutomationProfile)
chrome.exe --remote-debugging-port=9527 --user-data-dir="D:seleniumAutomationProfile"
每次执行(1)(2)两行命令就能打开同一个chorme了,建议放在程序解析的最上方,这样浏览器关闭后下次可以通过命令行快速打开
(3)浏览器已经打开了,登录一下自己的微博
(4)链接一下程序和浏览器
# 这部分代码我直接扔在了所有函数之前,搞全局
# 把chormedriver的路径写到这里
chromedriver_path= "D:/Users/16653/AppData/Local/Programs/Python/Python36/chromedriver.exe"
option = ChromeOptions()
option.add_experimental_option("debuggerAddress", "127.0.0.1:9527")
web = webdriver.Chrome(executable_path=chromedriver_path, options=option)
web.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
})
"""
})
web.implicitly_wait(10)# 等待网页的加载时间
2、进行关键词的检索
从这里开始写函数的主体,自己搞个函数名把这些代码放进去
关键词搜索的链接如下:
https://s.weibo.com/weibo?q=这里填关键词&Refer=index
搜索页面翻页直接在后面加一个page=页码,如第二页
https://s.weibo.com/weibo?q=这里填关键词&Refer=index&page=2
selenium获取初步搜索结果
web.get(url) # url就是搜索的链接
html = web.page_source
print (html) # 输出当前程序获取到的网页信息,用于检查网页是否正常获取
在浏览器里点击右键选择检查,在浏览器里面可以用检查页面左上角的框框箭头符号方便得在左边选择图案或者文字,然后实时在右边看到这个被选择的要素在哪个标签
可以发现每个博文都在action-type="feed_list_item"的div标签下(结合下图左右蓝色部分理解,标签就是一个<>包含的东西)这是一个很重要的地方,学会用浏览器的这个功能选取自己需要的信息在哪个标签里面,下面所有获取信息的代码几乎都是基于此
那我们可以通过beautifulsoup的findAll函数把所有这些标签的内容选择出来放进list(其他标签下提取信息也适用这个函数哦,只需要对应修改div,action-type,feed_list_item就行)
如果只想要找到的第一个div标签下的信息就用find函数,而不是findAll
soup = bs(html, 'html.parser')
list = soup.findAll("div", {'action-type': "feed_list_item"})
3、解析多种数据
(1)获取博文的文本内容,微博的文章字数太长会收起来,为了文本内容获取完整必须先将所有文本展开。
web_object = {}
html = web.page_source
# 获取这一网页的所有未展开的文章的展开按钮
button_list = web.find_elements_by_css_selector('a[action-type="fl_unfold"]') #点击所有展开
# 在for循环里面每个都点击展开
for bt in button_list:
try :
bt.click()
except Exception as e:
print(e.args)
# html转beautifulsoup格式
soup = bs(html, 'html.parser')
# 已经展开了,开始正常获取这一页的微博列表list
list = soup.findAll("div", {'action-type': "feed_list_item"})
for i in list:
# 获取微博的文本信息,strip用于跳过字符前面的空白
txt = i.findAll("p", {'class':"txt"})[-1].get_text().strip()
print(txt) # 输出获得的内容
web_object['text'] = txt
</