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