微博爬虫展开全文_爬取新浪微博新闻,包括模拟登陆,数据存储等!最适合...

微博爬虫展开全文_爬取新浪微博新闻,包括模拟登陆,数据存储等!最适合...

2023年6月29日发(作者:)

微博爬⾍展开全⽂_爬取新浪微博新闻,包括模拟登陆,数据存储等!最适合新⼿的教程!...写在最开头该程序主要是为爬取新浪微博,想要搜索的信息,主要报错的信息为⽂本,其他元素未涉及,此外微博博主信息,笔者也不关注,时间等信息同样不关注,主要⽬的就是获取⽂本信息。因此,本着对读者同样同样也是对⾃⼰负责的态度,⽂中添加了⼀些程序的注释及⼀些爬⾍的思想。如果不感兴趣,直接想看程序,可以直接clone该代码,已上传到github;当然,如果有问题可以在评论中留⾔,可以和笔者⼀起探讨(其实,⼀些重点及难点,笔者多数都已⽂中提及到)。下载浏览器驱动这⼀步视你电脑装了哪个浏览器(具体使⽤使⽤什么版本根据浏览器⾃⾏选择)FireFox使⽤FireFoxdriver⾕歌浏览器使⽤chromedriver测试驱动是否匹配/font>使⽤如下代码测试浏览器是否可能跳出,⽽且可以正常跳转到⽬标页⾯,则证明可以成功使⽤插件(注意笔者是将该插件放到当前⽬录下,如果放在其它地⽅,需要使⽤绝对路径)from selenium import webdriverdriver = x(executable_path="") #(executable_path='')('')模拟登陆⾸先需要分析待爬取页⾯信息(右键检查或者直接F12)这⾥多说⼏句,爬⾍都是爬取静态页⾯,可以看⼀下,我们⽬标页⾯爬取并不是那么容易,需要经过⼏个步骤。登录到页⾯之中(如果不登录,那就只能获取第⼀页的信息,这也是新浪的⼀种反爬⾍措施),那么问题来了,你进来的时候是第⼀页,只能点击“登录”按钮后,才能看到登录框,⽽我们获取的页⾯也只能是静态的,因此这种需要跳转的登录框也是⼀个问题。解决⽅法如下(需要重新获取打开登录框的页⾯) nowhandle = t_window_handle _(nowhandle)那第⼆步就是获取登录框中⽤户名,密码。笔者使⽤的是chrome,这个浏览器其实对前端页⾯更加友好,当然,你使⽤其他浏览器也可以。(如下,拾取css selector,或者xpath都可以)笔者获取到的信息如下(这种⽹站为了反爬⾍,都会定时的更新页⾯,所以拾取的元素不⼀定是⼀样的) print("输⼊⽤户名") # 点击输⼊框,这⼀步是为了让程序找到输⼊⽤户名的地⽅,笔者试过不点击,直接输⼊⽤户名,密码,会报错 '_login_register_ix > div:nth-child(3) > _wrap > input').click() # 输⼊⽤户名 _element_by_css_selector( 'div:nth-child(3) > _wrap > input').send_keys(me) print('输⼊密码') # 输⼊密码 _element_by_css_selector( 'div:nth-child(3) > _wrap > input').send_keys(rd) # 点击登录按钮 _element_by_css_selector('div:nth-child(3) > div:nth-child(6) > a').click() # wait loginpage loading (30)# 为了等待页⾯完全加载,这个时间受⽹络,浏览器等因素影响 _element_by_css_selector(#layer_081 > t > _login_register_ix > div:nth-child(3) > _保存这个过程的cookies,⽤于下次登录使⽤cookies = _cookies()cookie_dict = {}for cookie in cookies: if 'name' in () and 'value' in (): cookie_dict[cookie['name']] = cookie['value']with open('./', 'w') as f: # 保存cookies到本地 ((cookies)) print("保存成功")分析待爬取页⾯信息注意,这⾥应该登录⽹站,⼿动分析待爬取页⾯信息(⽤“#娱乐新闻#”这个话题举例)可以看到,页⾯包含很多⽂字信息,我们的⽬的就是获取这写⽂字信息那很显然,⼜发现了⼀个问题,就是展开全⽂这个怎么处理,还是⼀样,F12分析页⾯第⼀步选中⽂字,查看css/xpath元素,以及“展开全⽂”,其实很快就会发现规律,"展开全⽂"在页⾯中是以“展开全⽂c”存放的,展开以后是“展开全⽂d”,废话不多说,直接上代码def open_all_text(self, driver, selector): """ 判断有没有展开全⽂ :param node: :return: """ # 如果需要展开全⽂,点击后提取⽂本 if _element_by_css_selector(selector + '2)').th('展开全⽂c'): for i in range(2, 5): if _element_by_css_selector(selector + '2)') .find_element_by_css_selector('a:nth-child(' + str(i) + ')').th('展开全⽂c'): _element_by_css_selector(selector + '2)'). find_element_by_css_selector('a:nth-child(' + str(i) + ')').click() return True else: return ('/weibo/' + '%23' + content + '%23')(10)for i in range(total_page): if i != 0: ('/weibo/' + '%23' + content + '%23&page=' + str(i + 1)) print('当前page', i + 1, ';', '已有数据', len(news_list)) (10)# 这⾥的24是页⾯每页做多也就24个⽂本框 for j in range(1, 24):# 下⾯的selector就是⼀种拼接⽅式,很随意,可以最⼤化的获取到页⾯信息,也可以做其他尝试 selector = 'div:nth-child(' + str(j) + ') > div > -feed > t > p:nth-child(' try: if _all_text(driver, selector): jq_text = _element_by_css_selector(selector + '3)').e('收起全⽂d', '') else: jq_text = _element_by_css_selector(selector + '2)').text news_(jq_text) except: pass保存数据def list_to_json(list, json_file_name): """ 将list写⼊到json⽂件 :param list: :param json_file_name: 写⼊的json⽂件名字 :param json_file_save_path: json⽂件存储路径 :return: null """ with open(json_file_name, 'w', encoding='utf-8') as f: (list, f, ensure_ascii=False)def json_to_jsonl(input_path, output_path): """ 将json⽂件转化为更加宜读的jsonlines⽂件 """ n = 0 with open(input_path, 'r', encoding="utf-8") as rf: with (output_path, 'w') as wf: data_list = (rf) for data in data_list: print(data) n += 1 (data) print("总数据:", n, '条')到此就整个案例都弄完了!如果你需要此案例的源码,加下群:1136192749

发布者:admin,转转请注明出处:http://www.yc00.com/news/1687982768a63552.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信