查看原文
其他

爬虫实战|Selenium爬取微信公众号标题与链接

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:陈丹慧, 中南财经政法大学金融学院

本文编辑:石   艳

技术总编:张馨月

爬虫俱乐部云端课程

  爬虫俱乐部于2020年暑期在线上举办的Stata与Python编程技术训练营和Stata数据分析法律与制度专题训练营已经圆满结束啦~应广大学员需求,我们的课程现已在腾讯课堂全面上线,且继续提供答疑服务。现在关注公众号并在朋友圈转发推文《来腾讯课堂学Stata和Python啦》或《8月Stata数据分析法律与制度专场来啦!》,即可获得600元课程优惠券,集赞50个再领200元课程优惠券!(截图发至本公众号后台领取)原价2400元的课程,现在只要1600元!




导读


《爬虫大杀器 | “手把手”教你配置Selenium》《Selenium登录豆瓣》等推文中,我们都对selenium这一利器的使用进行过介绍。selenium可以模仿用户,点击事件、输入数据、模拟鼠标位置等,也可以将其与数据抓取结合起来,进行自动化爬取数据。临近新年,很多拥有微信公众号的人可能想对历史文章进行年末总结,这时候获取一张包含全部历史文章标题、链接、阅读量等信息的Excel表,即可方便地进行阅读量统计,批量打开文章链接等操作。因此,我们今天以微信公众平台为例,简单介绍一下如何用selenium爬取数据。




一、登录微信公众号平台

首先我们要找到微信公众平台登录的链接(https://mp.weixin.qq.com/),使用webdriver进入登录界面。

1from selenium import webdriver
2import time 
3url='https://mp.weixin.qq.com/'
4driver=webdriver.Chrome(executable_path="填写放置chromedriver的路径")
5driver.get(url) #进入链接
6driver.maximize_window() #设置窗口最大化
7driver.implicitly_wait(3#隐式等待3秒
我们可以看到默认情况下是扫码登录,要想通过账号密码登录,可以通过xpath定位“使用账号登录”的元素。如下图所示:鼠标放置在需要定位的“使用账号登录”处,右键选择“检查”,在右侧就会高亮出现对应的element,再copy其xpath即可。


1driver.find_element_by_xpath('//[@id="header"]/div[2]/div/div/div[2]/a').click() #选择使用账号登录 
2time.sleep(2)
3driver.find_element_by_xpath('//*[@id="header"]/div[2]/div/div/div[1]/form/div[1]/div[1]/div/span/input').send_keys("您的账号")
4time.sleep(2)
5driver.find_element_by_xpath('//*[@id="header"]/div[2]/div/div/div[1]/form/div[1]/div[2]/div/span/input').send_keys("您的密码")
6time.sleep(2)
7driver.find_element_by_xpath('//*[@id="header"]/div[2]/div/div/div[1]/form/div[4]/a').click()  #点击登录
登录后,可能遇到扫码安全验证问题,手动扫码即可。



二、提取信息



进入微信公众平台后,我们需要提取的信息为:文章发布时间、标题、链接和阅读量。截止本文撰写时,共有140页信息,除最后一页外,每页有7篇文章信息。

1.获取单条信息

文章发布时间、标题、链接和阅读量这些信息仍可以通过xpath定位对应元素。类似上述定位“使用账号登录”的操作,我们可以获取一系列的xpath。对于发布时间、标题和阅读量这种文本信息,可以用text方法获取;对于链接,分析xpath,可以发现其是该元素对应的一个href属性,可以用get_attribute()方法得到。

1#获取单条信息
2date=driver.find_element_by_xpath('//*[@id="list"]/li[1]/div[1]/em').text
3title=driver.find_element_by_xpath('//*[@id="list"]/li[1]/div[2]/span/div/div[2]/a/span').text
4view=driver.find_element_by_xpath('//*[@id="list"]/li[1]/div[2]/span/div/div[2]/div/div[1]/div/span').text
5url=driver.find_element_by_xpath('//*[@id="list"]/li[1]/div[2]/span/div/div[2]/a').get_attribute('href')
6print(date,title,view,url)


2.获取整页信息

分析下一行信息的xpath,可以发现其变化主要在li这个节点,以date为例://*[@id="list"]/li[1]/div[1]/em是第一行的xpath,//*[@id="list"]/li[2]/div[1]/em是第二行的xpath。

因此可以先定位到li这个节点,获取一个元素列表,再对该列表进行循环,获取单页全部信息。1#获取第一页全部信息
2lis=driver.find_elements_by_xpath('//*[@id="list"]/li')
3#print(len(lis))
4for li in lis[0:]:
5    date=li.find_element_by_xpath('./div[1]/em').text
6    title=li.find_element_by_xpath('./div[2]/span/div/div[2]/a/span').text
7    view=li.find_element_by_xpath('./div[2]/span/div/div[2]/div/div[1]/div/span').text
8    url=li.find_element_by_xpath('./div[2]/span/div/div[2]/a').get_attribute('href')
9    print(date,title,view,url)


此外,如下图,有的文章因为某些原因被删除了,我们不需要获得其信息。因此,我们可以定位"已群发"和"已删除"元素,在提取这行其他信息前先做一个判断:若提取到"已删除"这个文本信息,则跳过接下来对这行的操作,爬取下一行;否则继续提取这行其他信息。


1deleted="已删除"
2sent=li.find_element_by_xpath('./div[1]/div/span/span').text
3if sent==deleted:
4    pass
5else:
6    date=li.find_element_by_xpath('./div[1]/em').text
7    #...          

3.获取全部信息

获取单页信息后,可以继续通过xpath定位到下一页实现翻页,也可以使用find_element_by_link_text实现翻页。1driver.find_element_by_link_text("下一页").click()
最后对页数进行循环,即可获取全部信息,完整程序和部分excel数据如下: 1from selenium import webdriver
2import time
3url='https://mp.weixin.qq.com/'
4driver=webdriver.Chrome(executable_path="E:\Python\chromedriver.exe")
5driver.get(url)
6driver.maximize_window()
7driver.implicitly_wait(3)
8driver.find_element_by_xpath("//div[@class='login__type__container login__type__container__scan']//a").click() #选择使用账号登录
9time.sleep(2)
10driver.find_element_by_xpath('//*[@id="header"]/div[2]/div/div/div[1]/form/div[1]/div[1]/div/span/input').send_keys("您的账号")
11time.sleep(2)
12driver.find_element_by_xpath('//*[@id="header"]/div[2]/div/div/div[1]/form/div[1]/div[2]/div/span/input').send_keys("您的密码")
13time.sleep(2)
14driver.find_element_by_xpath('//*[@id="header"]/div[2]/div/div/div[1]/form/div[4]/a').click() #登录
15
16file='./微信公众号历史文章.csv'
17with open(file,'w'as f:
18    f.write("发布时间,标题,阅读量,链接\n")
19
20deleted="已删除"
21
22for i in range(1,141):
23    print('正在爬取第%d页'%i)
24    lis=driver.find_elements_by_xpath('//*[@id="list"]/li')
25    for li in lis[0:]:
26        sent=li.find_element_by_xpath('./div[1]/div/span/span').text
27        if sent==deleted:
28            pass
29        else:
30            date=li.find_element_by_xpath('./div[1]/em').text
31            title=li.find_element_by_xpath('./div[2]/span/div/div[2]/a/span').text
32            view=li.find_element_by_xpath('./div[2]/span/div/div[2]/div/div[1]/div/span').text
33            url=li.find_element_by_xpath('./div[2]/span/div/div[2]/a').get_attribute('href')
34            print(date,title,view,url)
35            time.sleep(3)
36            with open(file,'a'as f:
37                f.write('%s,%s,%s,%s\n'%(date,title,view,url))
38            time.sleep(3)
39    try:
40        driver.find_element_by_link_text("下一页").click()
41    except:
42        driver.quit()   



今天的介绍就到这里了。selenium虽然方便,但也不可避免地存在速度慢、效率低等问题,大家可以按需使用。在后台回复“爬虫俱乐部历史消息”,即可获得我们公众号截止目前的全部历史消息!欢迎大家前来获取、食用!



对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!往期推文推荐轻轻一点,就知有没有|rqrs命令介绍

强大的正则表达式

自动群发邮件(二)——附带附件

自动群发邮件--email和smtplib基本模块的使用

批量处理变量名和标签的小方法

计算工作日的小能手——workdays

Seminar | 企业错报与银行贷款合同

Seminar | 共同基金行业的性别歧视Seminar | 来自女儿的塑造:高管、女性社会化与企业社会责任

小贴士:Markdown的基本语法

听说相貌也能量化 | 调用百度人脸检测API实现颜值打分

列出指定属性的变量|findname命令比ds命令

新一代的标签转码小能手【爬虫实战】亚马逊网站Top100畅销书爬取

Json文件好帮手——JsonPath

数据转置pro之sxpose2文件"搬家"小助手:mvfiles

pyecharts绘图——河流图展示

你知道MDPI期刊的热门题目吗?

文件合并你不行,mergemany来帮宁分组进行描述性统计的小技巧 --astx命令介绍新年快乐|爬虫俱乐部2020年度总结关于我们


微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

此外,欢迎大家踊跃投稿,介绍一些关于stata和python的数据处理和分析技巧。投稿邮箱:statatraining@163.com投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存