微信文章爬虫demo -- 综合实验和练习
这周最主要的是写各种小爬虫,像京东商城图片抓取爬虫、糗事大百科抓取爬虫、微信文章爬虫,这些是跟着韦玮老师的书走的。不同的是,我比较喜欢按自己的思路做实现,然后再对比韦玮老师书中的实现,找到自己的不足和差距。
这周做下来,发现小爬虫的框架差距不大,基本就是反爬绕过 –> 页面数据抓取 –> 正则提取目标元素 –> 保存数据,所以上面这几个爬虫的实现主要是正则和一小部分流程不同,大体一致。不过相信这也是我目前还没真正入门进到真正爬虫导致,相信后面学习的过程,将会接触更多好玩的东西。
这次分享的是我写的一个微信文章爬虫,具备了以下功能,我还会进一步迭代和优化,希望这个玩意做得好玩一些。也希望大家吐槽下这个实现,给些建议交流下,感谢。
- 自动抓取代理IP和更新
- Cookie自动保存重装载
- 部分简单的容错处理
- 通过搜狗引擎查找并抓取微信文章
下面的code可以看出有一些函数没做实现,比如图片保存、页面链接自动产生等。我这周末事情多,所以才没整完。原计划是实现url保存成mhtml格式,这样抓取到的文章和图片能一起保存下来,我争取这周做出来,然后分享。
上周的练习也让我看到自身不少薄弱的地方,所以后续会想办法加强起来,才能提高code质量和价值。
#!/usr/local/bin/python3
#-*- coding: utf-8 -*-
__author__ = 'donald.zhuang'import urllib.request
import http.cookiejar
import random
import re
import os
import socket# for collecting proxy address
Url_ProxyAddr = 'http://www.xicidaili.com/nn'
'''抓取代理ip地址的正则'''
RegExp_ProxyAddr= '<tr class=.*?<td>(.*?)</td>\s+<td>(.*?)</td>.*?(HTTPS?)</td>' # for Article
UrlTemp = 'http://weixin.sogou.com/weixin?query=%s&type=2&page=%d'
KeyWd_Page = 1
KeyWd_Query = 'Crawler'
'''抓取微信文章链接和标题的正则'''
RegExp_UrlTitle = '(?<=<a target="_blank" href=")(https?://[^\s\(\)<>"]*).*?>(.*?)</a>'# request header
Headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36',}# cookie
Cookie = None
CookieFile = 'cookie.txt'# global Varibles
setProxyAddr = []def Get_ProxyAddr():'''获取代理IP地址,采用的是http://www.xicidaili.com/nn,不过质量略差'''global setProxyAddrtry:req = urllib.request.Request(Url_ProxyAddr, None, Headers)except:print('[DBG ERR ] Get proxy address error.')return setProxyAddrdata = urllib.request.urlopen(req).read().decode('utf-8')AllProxyAd = re.compile(RegExp_ProxyAddr, re.S).findall(data)for proxy in AllProxyAd:if proxy[2] == 'HTTP':setProxyAddr.append(proxy[0]+':'+proxy[1])return setProxyAddrdef Build_CookieAndProxy(ProxyAddr=None):'''cookie自动处理和代理IP地址设置'''global Cookie, CookieFileCookieProcessor = NoneProxyHandler = None'''根据是否传入文件名以及文件是否存在决定加载方式'''if (CookieFile == None) or not(os.path.exists(CookieFile)):print("[DBG INFO] Make a New File to store the cookie")Cookie = http.cookiejar.MozillaCookieJar(CookieFile)else: '''若指定的文件存在则直接加载'''print("[DBG INFO] Load %s to save cookie"%CookieFile)Cookie = http.cookiejar.MozillaCookieJar()Cookie.load(filename = CookieFile, ignore_discard = True, ignore_expires = True)CookieProcessor = urllib.request.HTTPCookieProcessor(Cookie)Cookie.save(CookieFile, ignore_discard = True, ignore_expires = True) '''设置代理ip,这个虫子抓的是http协议的,所以配置如下'''print("[DBG INFO] Proxy address: %s" % ProxyAddr)if ProxyAddr != None:ProxyHandler = urllib.request.ProxyHandler({'http':ProxyAddr})else:ProxyHandler = urllib.request.ProxyHandler({})'''安装全局opener,这样可以直接采用urllib相关实现,方便些'''Opener = urllib.request.build_opener(CookieProcessor,ProxyHandler) urllib.request.install_opener(Opener)def Change_Proxy():'''改变代理IP地址'''proxyaddr = random.choice(setProxyAddr)Build_CookieAndProxy(proxyaddr)pass def Generate_PageUrl():passdef Find_UrlAndTitleOnPage(PageUrl):'''抓取搜索引擎页面中的微信文章名和链接,也加入各种容错检测-->主要是方便了解情况,可以简化掉'''global Cookie, CookieFiletry:req = urllib.request.Request(PageUrl, None, Headers)content = urllib.request.urlopen(req, timeout = 30) # set Timeout as 10sexcept urllib.error.URLError as UrlErr:print('[DBG ERR ] URLError ', end = '')if hasattr(UrlErr, 'code'):print('Error Code: ', UrlErr.code)if hasattr(UrlErr, 'reason'):print('Error Reason: ', UrlErr.reason)returnexcept socket.error as SocketErr:print('[DBG ERR ] Sokect Error: ', SocketErr)returnexcept requests.exceptions.RequestException as ReqErr:print('[DBG ERR ] RequestException')returnelse:print('[DBG INFO] Get Title Url Here')data = content.read().decode('utf-8')Cookie.save(CookieFile, ignore_discard = True, ignore_expires = True)setUrl = re.compile(RegExp_UrlTitle,re.S).findall(data)return setUrldef Fix_UrlAndTitle(Url, Title):'''修正正则匹配到的链接和文章名'''UrlTitle = []if (Url != None) and (Title != None):Url = Url.replace( 'amp;', '' )Title = Title.replace( '<em><!--red_beg-->', '' ).replace( '<!--red_end--></em>', '' )UrlTitle.append(Url)UrlTitle.append(Title)print('[DBG INFO] Title: %s\r\n Url:%s'%(Title, Url))else:print('[DBG ERR ] Url or Title is None type')return UrlTitledef Save_Article(Url,Title):'''保存链接指定的文章,文章名作为文件名 --> 对于有/这类符号的会出现bug,下面有提示'''global Cookie, CookieFilereq = urllib.request.Request(Url, None, Headers)data = urllib.request.urlopen(req).read().decode('utf-8')Cookie.save(CookieFile, ignore_discard = True, ignore_expires = True)with open(Title+'.html', 'w') as hFile: # TODO: title name may cause some fault hFile.write(data)def Save_Photo(TitleUrl):passdef Main_Func():'''主函数,主要是一个测试的demo'''Url = UrlTemp % (KeyWd_Query, KeyWd_Page)setText = Find_UrlAndTitleOnPage(Url) # Get the set of Textwhile setText is None:Change_Proxy()setText = Find_UrlAndTitleOnPage(Url) for i in setText:i = Fix_UrlAndTitle(i[0], i[1])Save_Article(i[0], i[1])if __name__ == '__main__':Get_ProxyAddr()Change_Proxy()
# Build_CookieAndProxy()Main_Func()
微信文章爬虫demo -- 综合实验和练习相关推荐
- 微信公众号、微信号、微信文章爬虫(搜狗搜索)
微信公众号.微信号.微信文章爬虫(搜狗搜索) 微信上面的东西真的不好爬,幸好我找到了一个神器!!! 这个能不能弄点东西出来呢? 这个链接还挺整齐的 嗯哼~~~~~~我似乎发现了什么 直接上代码啦 im ...
- Java爬虫demo,爬取文章链接
以下是一个简单的 CSDN 某个账号下的文章 爬虫 demo,它可以爬取指定账户中的20篇文章链接: demo用到了 Jsoup 库来处理 HTML 文档,需要先下载并导入该库.可以在项目的 pom. ...
- php同步微信文章,微信文章同步至wordpress项目总结
近些天帮客户实现了这样一个功能:将他们家三个都已经运营了两三年的公众号的所有文章都发布至wordpress 搭建的博客类网站上面去,且分成三个不同的栏目和作者,且微信文章的格式要求同步过去不能有所改变 ...
- 实验题·华为eNSP综合实验操作
华为综合实验 文章目录 华为综合实验 实验环境 需求描述 实验步骤 1.配置二层交换机SW1 2.配置二层交换机SW2 3.配置三层交换机SW3 4.配置二层交换机SW4 5.配置路由器R1 6.PC ...
- 订阅号微信公众号历史文章爬虫php,一步步教你怎么打造微信公众号历史文章爬虫...
原标题:一步步教你怎么打造微信公众号历史文章爬虫 开篇语: 邓爷爷曾说过:不管黑猫白猫,逮到耗子就是好猫.不管我是凑的还是笨办法堆出来的,确实把批量导出微信公众号所有历史文章的这个功能给做出来了,而且 ...
- 微信公众平台接口调试工具json格式不对怎么搞_一步步教你打造微信公众号文章爬虫(3)-批量下载...
本文为本专题第3篇,如果你基础不错的话只看这一篇的讲解及源代码应该就能轻松实现批量下载所有文章了,基础稍差的可以先看一下前两篇,只要你有点基础,有点耐心,八成朋友都至少能照葫芦画瓢实现批量下载文章的功 ...
- python爬虫——使用xpath爬取搜狗微信文章
缺点:爬取一定数量之后会出现验证码,导致不能继续爬取,需要更换ip才可以继续爬取,或者在浏览器重新输入验证码之后复制cookie后方能继续爬取. import requests from fake_u ...
- python 公众号爬虫_微信公众号文章爬虫
很多的微信公众号都提供了质量比较高的文章阅读,对于自己喜欢的微信公众号,所以想做个微信公众号爬虫,爬取相关公众号的所有文章.抓取公众号的所有的文章,需要获取两个比较重要的参数.一个是微信公众号的唯一I ...
- 微信公众号爬虫(综合解决方案)
最终解决方案 通过搜狗微信先检索公众号,获取公众号主页链接,接着爬每一篇具体文章,具体用selenium实现,当然你也可以用webkit.Geoko渲染引擎自己去渲染.用selenium.webkit ...
- 反爬虫微信文章(总结)
在爬虫时,某些网站会有封ip的现象,所以选择利用代理伪装我们的ip进行爬虫请求,但进行爬虫时可能需要很多ip,这时就要求维护一个代理池(池也就是代理队列),可放进代理,也可取出代理. 本文中选择的崔庆 ...
最新文章
- 广州富力再引强援 95后潜力中锋桂宏加盟球队
- python numpy中astype使用不当导致图像出现artifact
- SAP Spartacus 3.0 加载homepage的逻辑
- I - Trade Gym - 100212I 网络流
- 西宁a货翡翠,孝感a货翡翠
- 帝国备份王(Empirebak) \class\functions.php、\class\combakfun.php GETSHELL vul
- [Vue.js]实战 -- 电商项目(四)
- springBoot于tomcat7搭建websocket服务
- 命令行 蓝牙_蓝牙键盘接入UOS系统的方法
- C++实现binary文件读取(可对‘bil‘,‘bsq‘ float32,double,unchar,unit16,unit8等格式进行读取)
- python的输出语句_python 中简单的输出语句
- 141种各类工业常用软件
- c++语言中如何检测鼠标消息,c++ 如何检测全局鼠标按钮事件
- GaussView 6 linux 64
- 南桥和北桥-主板芯片组发展史
- MBA明年学费酝酿大涨 涨价幅度可能高达50%
- 人才管理是什么意思_复合型人才是什么意思(复合型人才八种能力)
- springcloud实战:springboot的核心原理
- [ACL22] HIBRIDS:Hierarchical Biases for Structure-aware Long Document Summarization 阅读笔记
- 物理隔离网闸——入门篇(2)
热门文章
- 在启动时在Raspberry Pi上运行程序的五种方法
- Apache 重写规则及参数详解,入门看这个就够了
- Mplayer播放器程序设计Linux,Linux下编程实现mplayer播放器总结
- 数据结构小知识点——广义表 “朝闻道”知识分享大赛
- 解决 VMware 无法复制粘贴问题
- 什么是关键字驱动框架?
- 怎么查EI论文的检索号
- Firefox火狐浏览器ca证书(cacert)安装
- CRM系统有哪些效果?
- 计算机mc代表什么意思6,我的世界:萌新无法理解的6个老梗,唯老MC才懂!你能看懂几个?...