- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章使用Selenium实现微博爬虫(预登录、展开全文、翻页)由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
在csdn发的第一篇文章,时隔两年,终于实现了爬微博的自由!本文可以解决微博预登录、识别“展开全文”并爬取完整数据、翻页设置等问题。由于刚接触爬虫,有部分术语可能用的不正确,请大家多指正! 。
1、静态网页 静态网页是纯粹的html,没有后台数据库,不含程序,不可交互,体量较少,加载速度快。静态网页的爬取只需四个步骤:发送请求、获取相应内容、解析内容及保存数据.
2、动态网页 动态网页上的数据会随时间及用户交互发生变化,因此数据不会直接呈现在网页源代码中,数据将以json的形式保存起来。因此,动态网页比静态网页多了一步,即需渲染获得相关数据.
3、区分动静态网页的方法 加载网页后,点击右键,选中“查看网页源代码”,如果网页上的绝大多数字段都出现源代码中,那么这就是静态网页,否则是动态网页.
1.逆向分析爬取动态网页 适用于调度资源所对应网址的数据为json格式,javascript的触发调度。主要步骤是获取需要调度资源所对应的网址-访问网址获得该资源的数据。(此处不详细讲解) 。
2.使用selenium库爬取动态网页 使用selenium库,该库使用javascript模拟真实用户对浏览器进行操作。本案例将使用该方法.
1.selenium库使用pip工具进行安装即可。 2.下载与chrome浏览器版本匹配的浏览器补丁。 step1:查看chrome的版本 。
step2:去下载相应版本的浏览器补丁。网址: step3:解压文件,并将之放到与python.exe同一文件下 。
1.导入selenium包 。
1
2
3
4
5
6
|
from
selenium
import
webdriver
from
selenium.webdriver.support
import
expected_conditions as ec
from
selenium.webdriver.support.ui
import
webdriverwait
from
selenium.webdriver.common.by
import
by
import
time
import
pandas as pd
|
2.打开页面 。
1
2
3
4
5
6
7
|
driver
=
webdriver.chrome()
print
(
'准备登陆weibo.cn网站...'
)
#发送请求
driver.get(
"https://login.sina.com.cn/signup/signin.php"
)
wait
=
webdriverwait(driver,
5
)
#重要:暂停1分钟进行预登陆,此处填写账号密码及验证
time.sleep(
60
)
|
3.采用交互式运行,运行完上面两段程序,会弹出一个框,这个框就是用来模拟网页的交互。在这个框中完成登录(包括填写登录名、密码及短信验证等) 。
4.完成预登录,则进入个人主页 。
1.定位上图中的关键词输入框,并在框中输入搜索对象,如“努力学习” 。
1
2
3
4
5
6
7
8
|
#使用selector去定位关键词搜索框
s_input
=
driver.find_element_by_css_selector(
'#search_input'
)
#向搜索框中传入字段
s_input.send_keys(
"努力学习"
)
#定位搜索键
confirm_btn
=
driver.find_element_by_css_selector(
'#search_submit'
)
#点击
confirm_btn.click()
|
2.当完成上步的代码运行后,会弹出新的窗口,从个人主页跳到微博搜索页。但是driver仍在个人主页,需要人为进行driver的移动,将之移动到微博搜索页.
3.使用switch_to.window()方法移位 。
1
2
|
#人为移动driver
driver.switch_to.window(driver.window_handles[
1
])
|
1.了解每个元素的selector,用以定位(重点在于唯一标识性) 。
2.使用selector定位元素,并获取相应的数据 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
comment
=
[]
username
=
[]
#抓取节点:每个评论为一个节点(包括用户信息、评论、日期等信息),如果一页有20条评论,那么nodes的长度就为20
nodes
=
driver.find_elements_by_css_selector(
'div.card > div.card-feed > div.content'
)
#对每个节点进行循环操作
for
i
in
range
(
0
,
len
(nodes),
1
):
#判断每个节点是否有“展开全文”的链接
flag
=
false
try
:
nodes[i].find_element_by_css_selector(
"p>a[action-type='fl_unfold']"
).is_displayed()
flag
=
true
except
:
flag
=
false
#如果该节点具有“展开全文”的链接,且该链接中的文字是“展开全文c”,那么点击这个要素,并获取指定位置的文本;否则直接获取文本
#(两个条件需要同时满足,因为该selector不仅标识了展开全文,还标识了其他元素,没有做到唯一定位)
if
(flag
and
nodes[i].find_element_by_css_selector(
"p>a[action-type='fl_unfold']"
).text.startswith(
'展开全文c'
)):
nodes[i].find_element_by_css_selector(
"p>a[action-type='fl_unfold']"
).click()
comment.append(nodes[i].find_element_by_css_selector(
'p[node-type="feed_list_content_full"]'
).text)
else
:
comment.append(nodes[i].find_element_by_css_selector(
'p[node-type="feed_list_content"]'
).text)
username.append(nodes[i].find_element_by_css_selector(
"div.info>div:nth-child(2)>a"
).text)
|
1.使用for循环实现翻页,重点在于识别“下一页”按钮,并点击它 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
for
page
in
range
(
49
):
print
(page)
# 定位下一页按钮
nextpage_button
=
driver.find_element_by_link_text(
'下一页'
)
#点击按键
driver.execute_script(
"arguments[0].click();"
, nextpage_button)
wait
=
webdriverwait(driver,
5
)
#与前面类似
nodes1
=
driver.find_elements_by_css_selector(
'div.card > div.card-feed > div.content'
)
for
i
in
range
(
0
,
len
(nodes1),
1
):
flag
=
false
try
:
nodes1[i].find_element_by_css_selector(
"p>a[action-type='fl_unfold']"
).is_displayed()
flag
=
true
except
:
flag
=
false
if
(flag
and
nodes1[i].find_element_by_css_selector(
"p>a[action-type='fl_unfold']"
).text.startswith(
'展开全文c'
)):
nodes1[i].find_element_by_css_selector(
"p>a[action-type='fl_unfold']"
).click()
comment.append(nodes1[i].find_element_by_css_selector(
'p[node-type="feed_list_content_full"]'
).text)
else
:
comment.append(nodes1[i].find_element_by_css_selector(
'p[node-type="feed_list_content"]'
).text)
username.append(nodes1[i].find_element_by_css_selector(
"div.info>div:nth-child(2)>a"
).text)
|
1.使用dataframe保存字段 。
1
|
data
=
pd.dataframe({
'username'
:username,
'comment'
:comment})
|
2.导出到excel 。
1
|
data.to_excel(
"weibo.xlsx"
)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
from
selenium
import
webdriver
from
selenium.webdriver.support
import
expected_conditions as ec
from
selenium.webdriver.support.ui
import
webdriverwait
from
selenium.webdriver.common.by
import
by
from
bs4
import
beautifulsoup
import
time
import
pandas as pd
'''打开网址,预登陆'''
driver
=
webdriver.chrome()
print
(
'准备登陆weibo.cn网站...'
)
#发送请求
driver.get(
"https://login.sina.com.cn/signup/signin.php"
)
wait
=
webdriverwait(driver,
5
)
#重要:暂停1分钟进行预登陆,此处填写账号密码及验证
time.sleep(
60
)
'''输入关键词到搜索框,完成搜索'''
#使用selector去定位关键词搜索框
s_input
=
driver.find_element_by_css_selector(
'#search_input'
)
#向搜索框中传入字段
s_input.send_keys(
"努力学习"
)
#定位搜索键
confirm_btn
=
driver.find_element_by_css_selector(
'#search_submit'
)
#点击
confirm_btn.click()
#人为移动driver
driver.switch_to.window(driver.window_handles[
1
])
'''爬取第一页数据'''
comment
=
[]
username
=
[]
#抓取节点:每个评论为一个节点(包括用户信息、评论、日期等信息),如果一页有20条评论,那么nodes的长度就为20
nodes
=
driver.find_elements_by_css_selector(
'div.card > div.card-feed > div.content'
)
#对每个节点进行循环操作
for
i
in
range
(
0
,
len
(nodes),
1
):
#判断每个节点是否有“展开全文”的链接
flag
=
false
try
:
nodes[i].find_element_by_css_selector(
"p>a[action-type='fl_unfold']"
).is_displayed()
flag
=
true
except
:
flag
=
false
#如果该节点具有“展开全文”的链接,且该链接中的文字是“展开全文c”,那么点击这个要素,并获取指定位置的文本;否则直接获取文本
#(两个条件需要同时满足,因为该selector不仅标识了展开全文,还标识了其他元素,没有做到唯一定位)
if
(flag
and
nodes[i].find_element_by_css_selector(
"p>a[action-type='fl_unfold']"
).text.startswith(
'展开全文c'
)):
nodes[i].find_element_by_css_selector(
"p>a[action-type='fl_unfold']"
).click()
comment.append(nodes[i].find_element_by_css_selector(
'p[node-type="feed_list_content_full"]'
).text)
else
:
comment.append(nodes[i].find_element_by_css_selector(
'p[node-type="feed_list_content"]'
).text)
username.append(nodes[i].find_element_by_css_selector(
"div.info>div:nth-child(2)>a"
).text)
'''循环操作,获取剩余页数的数据'''
for
page
in
range
(
49
):
print
(page)
# 定位下一页按钮
nextpage_button
=
driver.find_element_by_link_text(
'下一页'
)
#点击按键
driver.execute_script(
"arguments[0].click();"
, nextpage_button)
wait
=
webdriverwait(driver,
5
)
#与前面类似
nodes1
=
driver.find_elements_by_css_selector(
'div.card > div.card-feed > div.content'
)
for
i
in
range
(
0
,
len
(nodes1),
1
):
flag
=
false
try
:
nodes1[i].find_element_by_css_selector(
"p>a[action-type='fl_unfold']"
).is_displayed()
flag
=
true
except
:
flag
=
false
if
(flag
and
nodes1[i].find_element_by_css_selector(
"p>a[action-type='fl_unfold']"
).text.startswith(
'展开全文c'
)):
nodes1[i].find_element_by_css_selector(
"p>a[action-type='fl_unfold']"
).click()
comment.append(nodes1[i].find_element_by_css_selector(
'p[node-type="feed_list_content_full"]'
).text)
else
:
comment.append(nodes1[i].find_element_by_css_selector(
'p[node-type="feed_list_content"]'
).text)
username.append(nodes1[i].find_element_by_css_selector(
"div.info>div:nth-child(2)>a"
).text)
'''保存数据'''
data
=
pd.dataframe({
'username'
:username,
'comment'
:comment})
data.to_excel(
"weibo.xlsx"
)
|
到此这篇关于使用selenium实现微博爬虫(预登录、展开全文、翻页)的文章就介绍到这了,更多相关selenium 微博爬虫 内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:https://blog.csdn.net/weixin_42863719/article/details/115586194 。
最后此篇关于使用Selenium实现微博爬虫(预登录、展开全文、翻页)的文章就讲到这里了,如果你想了解更多关于使用Selenium实现微博爬虫(预登录、展开全文、翻页)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
有没有办法对 Subversion 存储库执行全文搜索,包括所有历史记录? 例如,我编写了一个在某处使用过的功能,但后来不需要它,所以我对文件进行了 svn rm'd,但现在我需要再次找到它以将其用于
如何进行 MySQL 搜索,既匹配部分单词,又提供准确的相关性排序? SELECT name, MATCH(name) AGAINST ('math*' IN BOOLEAN MODE) AS rel
我在 postgresql 中创建了一个用于全文搜索的索引。 CREATE INDEX pesquisa_idx ON chamado USING gin(to_tsvector('portugues
我已经设置了一个数据库并启用了全文搜索,当我使用以下内容搜索数据库时,数据库中有一些条目包含“测试”一词,还有一个条目包含“测试更多”: SELECT keywords, title FROM dat
我想知道是否可以进行 MATCH() AGAINST()(全文)搜索,使得不直接相邻的单词需要按特定顺序排列?在我的网站上,当用户在双引号之间键入单词时,搜索将仅显示具有特定顺序的这些单词的结果。例如
我有一个 80,000 行的数据库,当我测试一些 FULLTEXT 查询时,我遇到了一个意想不到的结果。我已从 MYSQL 中删除停用词并将最小字长设置为 3。 当我执行此查询时: SELECT `s
我刚刚在我的 MYSQL 数据库中发现了一堆流氓数据... 到达它的唯一方法是通过其中一列 - FILE_PATH,其中包含文件路径的斜杠剥离版本。我需要在这组文件中找到一些恶意文件——它们的文件名都
我正在为我的站点构建一个小的搜索功能。我正在接受用户的查询,提取关键字,然后针对提取的关键字运行全文 MySQL 搜索。 问题在于 MySQL 将词干视为文字。这是正在发生的过程: 用户搜索“棒球”之
这是一个关于使用(关系)数据库设计全文搜索的系统架构问题。我使用的具体软件是 Solr 和 PostgreSQL,仅供引用。 假设我们正在构建一个有两个用户 Andy 和 Betty 的论坛 -- P
当元素数组中的数组包含应与我的搜索匹配的文本时,我无法检索文档。 这里有两个示例文档: { _id: ..., 'foo': [ { 'name
我正在使用这个查询,但不幸的是它运行缓慢: SELECT *, (MATCH(`title`) AGAINST ('$word' IN BOOLEAN MODE) * 2 + MATC
我正在构建一个非常简单的产品目录,它将在 mysql 表中存储产品,我想尽快搜索产品(并尽可能相关)。产品数据库将非常大(大约 500.000 个产品),这就是为什么使用“like”而不使用索引的搜索
select count(distinct email_address) from users WHERE MATCH (email_address) AGAINST ('@r
我正在尝试在 mySQL 中进行简单的全文搜索,但在复数方面遇到一些问题。 我确实相信我符合50% 规则。 我不认为我使用了停用词。 我正在运行这样的查询: SELECT * FROM product
我在 innoDB 数据库中使用全文搜索时遇到了一个大问题。 首先,ns_pages 表有超过 2.6m 的记录,全文索引有 3 个键 block 。 该数据库在具有 128GB RAM 的 Dell
我有一个城市和州的数据库(大约 43,000 个)。我对其进行全文搜索,如下所示: select city, state, match(city, state_short, state) agains
我正在使用带有自然语言全文的 Mysql FULLTEXT 搜索,不幸的是,我遇到了 FULLTEXT 50% 阈值,如果给定的关键字出现在总行数的 50% 时间,则不允许我搜索行。 我搜索并找到了一
如果我搜索单词hello,那么我没有匹配到,而我搜索单词hella,那么我得到了匹配。同样的情况也发生在“Non”这个词上。我在 Mac 上的 MAMP 和 sqlfiddle.com 上进行了测试,
所以我有一个简单的场景。我有一张 field 表(事件 field 等)。我的查询看起来像: SELECT * FROM venues WHERE venues.name % 'Philips Are
我有一个表,其中有视频数据,如“标题”、“描述”等。我正在尝试使用 MySQL 全文索引编写一个搜索引擎。 SQL 查询适用于某些单词,但不是每个单词。这是我的 SQL 查询; SELECT * FR
我是一名优秀的程序员,十分优秀!