python下载微信公众号相关文章


Posted in Python onFebruary 26, 2019

本文实例为大家分享了python下载微信公众号相关文章的具体代码,供大家参考,具体内容如下

目的:从零开始学自动化测试公众号中下载“pytest"一系列文档

1、搜索微信号文章关键字搜索

2、对搜索结果前N页进行解析,获取文章标题和对应URL

主要使用的是requests和bs4中的Beautifulsoup

Weixin.py

import requests
from urllib.parse import quote
from bs4 import BeautifulSoup
import re
from WeixinSpider.HTML2doc import MyHTMLParser
 
class WeixinSpider(object):
 
 def __init__(self, gzh_name, pageno,keyword):
  self.GZH_Name = gzh_name
  self.pageno = pageno
  self.keyword = keyword.lower()
  self.page_url = []
  self.article_list = []
  self.headers = {
   'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'}
  self.timeout = 5
  # [...] 用来表示一组字符,单独列出:[amk] 匹配 'a','m'或'k'
  # re+ 匹配1个或多个的表达式。
  self.pattern = r'[\\/:*?"<>|\r\n]+'
 
 def get_page_url(self):
  for i in range(1,self.pageno+1):
   # https://weixin.sogou.com/weixin?query=从零开始学自动化测试&_sug_type_=&s_from=input&_sug_=n&type=2&page=2&ie=utf8
   url = "https://weixin.sogou.com/weixin?query=%s&_sug_type_=&s_from=input&_sug_=n&type=2&page=%s&ie=utf8" \
     % (quote(self.GZH_Name),i)
   self.page_url.append(url)
 
 def get_article_url(self):
  article = {}
  for url in self.page_url:
   response = requests.get(url,headers=self.headers,timeout=self.timeout)
   result = BeautifulSoup(response.text, 'html.parser')
   articles = result.select('ul[class="news-list"] > li > div[class="txt-box"] > h3 > a ')
   for a in articles:
    # print(a.text)
    # print(a["href"])
    if self.keyword in a.text.lower():
      new_text=re.sub(self.pattern,"",a.text)
      article[new_text] = a["href"]
      self.article_list.append(article)
 
 
 
headers = {'User-Agent':
      'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'}
timeout = 5
gzh_name = 'pytest文档'
My_GZH = WeixinSpider(gzh_name,5,'pytest')
My_GZH.get_page_url()
# print(My_GZH.page_url)
My_GZH.get_article_url()
# print(My_GZH.article_list)
for article in My_GZH.article_list:
 for (key,value) in article.items():
  url=value
  html_response = requests.get(url,headers=headers,timeout=timeout)
  myHTMLParser = MyHTMLParser(key)
  myHTMLParser.feed(html_response.text)
  myHTMLParser.doc.save(myHTMLParser.docfile)

HTML2doc.py

from html.parser import HTMLParser
import requests
from docx import Document
import re
from docx.shared import RGBColor
import docx
 
 
class MyHTMLParser(HTMLParser):
 def __init__(self,docname):
  HTMLParser.__init__(self)
  self.docname=docname
  self.docfile = r"D:\pytest\%s.doc"%self.docname
  self.doc=Document()
  self.title = False
  self.code = False
  self.text=''
  self.processing =None
  self.codeprocessing =None
  self.picindex = 1
  self.headers = {
   'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'}
  self.timeout = 5
 
 def handle_startendtag(self, tag, attrs):
  # 图片的处理比较复杂,首先需要找到对应的图片的url,然后下载并写入doc中
  if tag == "img":
   if len(attrs) == 0:
    pass
   else:
    for (variable, value) in attrs:
     if variable == "data-type":
      picname = r"D:\pytest\%s%s.%s" % (self.docname, self.picindex, value)
      # print(picname)
     if variable == "data-src":
      picdata = requests.get(value, headers=self.headers, timeout=self.timeout)
      # print(value)
    self.picindex = self.picindex + 1
    # print(self.picindex)
    with open(picname, "wb") as pic:
     pic.write(picdata.content)
    try:
     self.doc.add_picture(picname)
    except docx.image.exceptions.UnexpectedEndOfFileError as e:
     print(e)
 
 def handle_starttag(self, tag, attrs):
  if re.match(r"h(\d)", tag):
   self.title = True
  if tag =="p":
   self.processing = tag
  if tag == "code":
   self.code = True
   self.codeprocessing = tag
 
 def handle_data(self, data):
   if self.title == True:
    self.doc.add_heading(data, level=2)
   # if self.in_div == True and self.tag == "p":
   if self.processing:
    self.text = self.text + data
   if self.code == True:
    p =self.doc.add_paragraph()
    run=p.add_run(data)
    run.font.color.rgb = RGBColor(111,111,111)
 
 def handle_endtag(self, tag):
  self.title = False
  # self.code = False
  if tag == self.processing:
   self.doc.add_paragraph(self.text)
 
   self.processing = None
   self.text=''
  if tag == self.codeprocessing:
   self.code =False

运行结果:

python下载微信公众号相关文章

缺少部分文档,如pytest文档4,是因为搜狗微信文章搜索结果中就没有

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
在Python的Django框架中加载模版的方法
Jul 16 Python
Python 基于Twisted框架的文件夹网络传输源码
Aug 28 Python
学习Python3 Dlib19.7进行人脸面部识别
Jan 24 Python
Tensorflow 自带可视化Tensorboard使用方法(附项目代码)
Feb 10 Python
python Tcp协议发送和接收信息的例子
Jul 22 Python
python爬虫项目设置一个中断重连的程序的实现
Jul 26 Python
Django处理Ajax发送的Get请求代码详解
Jul 29 Python
Python有参函数使用代码实例
Jan 06 Python
jupyter notebook 增加kernel教程
Apr 10 Python
利用python下载scihub成文献为PDF操作
Jul 09 Python
python获得命令行输入的参数的两种方式
Nov 02 Python
Python3中最常用的5种线程锁实例总结
Jul 07 Python
python处理DICOM并计算三维模型体积
Feb 26 #Python
学习python可以干什么
Feb 26 #Python
Python3几个常见问题的处理方法
Feb 26 #Python
django 自定义过滤器的实现
Feb 26 #Python
使用Python将Mysql的查询数据导出到文件的方法
Feb 25 #Python
Python-ElasticSearch搜索查询的讲解
Feb 25 #Python
Python2 Selenium元素定位的实现(8种)
Feb 25 #Python
You might like
推荐一篇入门级的Class文章
2007/03/19 PHP
php标签云的实现代码
2012/10/10 PHP
thinkphp5.1框架中容器(Container)和门面(Facade)的实现方法分析
2019/08/05 PHP
解决jquery1.9不支持browser对象的问题
2013/11/13 Javascript
浅谈angular.js中实现双向绑定的方法$watch $digest $apply
2015/10/14 Javascript
分享JavaScript与Java中MD5使用两个例子
2015/12/23 Javascript
浅谈jQuery 选择器和dom操作
2016/06/07 Javascript
用JavaScript获取页面文档内容的实现代码
2016/06/10 Javascript
微信小程序 聊天室简单实现
2017/04/19 Javascript
JavaScript代码判断输入的字符串是否含有特殊字符和表情代码实例
2017/08/17 Javascript
如何让你的JS代码更好看易读
2017/12/01 Javascript
jQuery中常用动画效果函数知识点整理
2018/08/19 jQuery
了解JavaScript中的选择器
2019/05/24 Javascript
vue router动态路由设置参数可选问题
2019/08/21 Javascript
vue-cli创建的项目中的gitHooks原理解析
2020/02/14 Javascript
vue如何在项目中调用腾讯云的滑动验证码
2020/07/15 Javascript
简单了解前端渐进式框架VUE
2020/07/20 Javascript
浅谈vue在html中出现{{}}的原因及解决方式
2020/11/16 Javascript
Vue 实现可视化拖拽页面编辑器
2021/02/01 Vue.js
python实现对一个完整url进行分割的方法
2015/04/29 Python
Python中用字符串调用函数或方法示例代码
2017/08/04 Python
django用户登录验证的完整示例代码
2019/07/21 Python
使用python写一个自动浏览文章的脚本实例
2019/12/05 Python
python实现一次性封装多条sql语句(begin end)
2020/06/06 Python
Python不支持 i ++ 语法的原因解析
2020/07/22 Python
python 实现客户端与服务端的通信
2020/12/23 Python
微软香港官网及网上商店:Microsoft HK
2016/09/01 全球购物
世界上最具创新性的增强型知名运动品牌:Proviz
2018/04/03 全球购物
2014年计生标语
2014/06/23 职场文书
怎样写离婚协议书
2015/01/26 职场文书
初中班主任工作随笔
2015/08/15 职场文书
中国梦宣传标语口号
2015/12/26 职场文书
JS监听Esc 键触发事键
2021/04/14 Javascript
mybatis中sql语句CDATA标签的用法说明
2021/06/30 Java/Android
Windows Server 2019 安装DHCP服务及相关配置
2022/04/28 Servers
win11开机发生死循环重启怎么办?win11开机发生死循环重启解决方法
2022/08/05 数码科技