python selenium 爬虫爬取指定某一个公众号文章名称、地址
微信公众号文章目前办公需要很多,找好久都没找到,做出来分享给大家,本文只是给初学者提供一个思路,本文能用就行,拿到就能用的想法,没有精优代码。
需要安装selenium,谷歌浏览器,谷歌浏览器驱动。
直接上干货:
思路:自动登录公众号(需手动扫码),点击新建群发,点击自建图文,点击超级链接,点击选择其他公众号,输入公众号名称搜索,点击选择公众号,获取弹出框HTML,正则解析出标题,地址,日期。
为防止爬的太快限制,我把时间设置间隔得比较长外加随机时间,可以自己设置间隔时间。
from selenium import webdriver
import time
import re
import json
from selenium.webdriver.common.keys import Keys
import random
driver=webdriver.Chrome()#需要一个谷歌驱动chromedriver
driver.implicitly_wait(30)
driver.get('https://mp.weixin.qq.com/')#发起get请求打开微信公众号平台登录页面,然后输入账号密码登录微信公众号
driver.find_element_by_xpath(r'//*[@id="header"]/div[2]/div/div/div[1]/form/div[1]/div[1]/div/span/input').clear() #定位到账号输入框,清除里面的内容
driver.find_element_by_xpath(r'//*[@id="header"]/div[2]/div/div/div[1]/form/div[1]/div[1]/div/span/input').send_keys('1519908766@qq.com')#定位到账号输入框,输入账号1519908766
time.sleep(1)
driver.find_element_by_xpath(r'//*[@id="header"]/div[2]/div/div/div[1]/form/div[1]/div[2]/div/span/input').clear() #定位到密码输入框,清除里面的内容
driver.find_element_by_xpath(r'//*[@id="header"]/div[2]/div/div/div[1]/form/div[1]/div[2]/div/span/input').send_keys('123456')#定位到密码输入框,输入密码123456
driver.find_element_by_xpath(r'//*[@id="header"]/div[2]/div/div/div[1]/form/div[4]/a').click() #点击登录
time.sleep(15) #15秒内扫码登录
#登陆成功进入
a='//*[@id="app"]/div[2]/div[3]/div[1]/div[2]/a'
d = driver.find_element_by_xpath(a)
driver.execute_script('arguments[0].click()',d)#点击新建群发
time.sleep(5)
driver.switch_to.window(driver.window_handles[-1])#切换窗口
#点击新建图文
time.sleep(5)
a = r'//*[@id="js_msgSender"]/div/div[2]/div[1]/div/div/div[2]/a'
d = driver.find_element_by_xpath(a)
d.click()
time.sleep(1)
driver.switch_to.window(driver.window_handles[-1])#切换窗口
time.sleep(30)
a = r'//*[@id="js_editor_insertlink"]'#超级链接
d = driver.find_element_by_xpath(a)
# print(d.text)
d.click()
time.sleep(1)
d = driver.find_element_by_xpath(r'//*[@id="vue_app"]/div[5]/div[1]/div/div[2]/div[2]/form[1]/div[3]/div/div/p/button')
# time.sleep(5)
driver.execute_script('arguments[0].click()',d)
d = driver.find_element_by_xpath(r'//*[@id="vue_app"]/div[5]/div[1]/div/div[2]/div[2]/form[1]/div[3]/div/div/div/div/span/input')
# 公众号名称 '长龙修风生物事业部一血脉清片
d.send_keys('长龙修风生物事业部一血脉清片\n')
# time.sleep(3)
d = driver.find_element_by_xpath(r'//*[@id="vue_app"]/div[5]/div[1]/div/div[2]/div[2]/form[1]/div[3]/div/div/div/div[2]/ul/li[1]/div[1]/strong')
d.click()#选择总部公众号
# time.sleep(5)
##查看第一个文章
d = driver.find_element_by_xpath(r'//*[@id="vue_app"]/div[5]/div[1]/div/div[2]/div[2]/form[1]/div[4]/div/div/div[2]/div/div/label[1]/div/div[1]')
#鼠标移动到元素上
# ActionChains(driver).move_to_element(d).perform()
def getall():
for s in range(4):
s = s+1
s= str(s)
#选取整个弹出窗口
a = r'//*[@id="vue_app"]/div[5]/div[1]/div/div[2]/div[2]/form[1]/div[4]/div/div/div[2]/div/div/label[%s]'%s
d = driver.find_element_by_xpath(a)
# print(d.text)
# print('................')
# 获取弹出窗口html
t = d.get_attribute('innerHTML')
# print(t)
# print('................')
# 正则选取标题日期网址
title = re.findall('<div class="inner_link_article_title">(.*)</div> <div class="inner_link_article_date">', t)
day = re.findall('<div class="inner_link_article_date">(.*)</div></div>', t)
url = re.findall('<a href="(.*)" target="_blank"', t)
title = title[0]
day = day[0]
url = url[0]
print('标题:',title)
print('日期:',day)
print('网址:',url)
# getall()
# 总页数n
a = r'//*[@id="vue_app"]/div[5]/div[1]/div/div[2]/div[2]/form[1]/div[4]/div/div/div[3]/span[1]/span/label[2]'
n = driver.find_element_by_xpath(a)
n = n.text
n = int(n)
#从c页开始
c = 1
for x in range(n):
x = x+c
print('当前页数:',x)
t = random.randint(1,10)
getall()
a = r'//*[@id="vue_app"]/div[5]/div[1]/div/div[2]/div[2]/form[1]/div[4]/div/div/div[3]/span[2]/input'
d = driver.find_element_by_xpath(a)
x=x+1
d.clear()
d.send_keys('%s\n'%x)
time.sleep(10+t)
print('爬取结束,一共爬取页数:',n)
driver.quit()#关闭浏览器