微信文章爬虫demo -- 综合实验和练习
来源:互联网 发布:51单片机难的设计题目 编辑:程序博客网 时间:2024/05/16 13:00
这周最主要的是写各种小爬虫,像京东商城图片抓取爬虫、糗事大百科抓取爬虫、微信文章爬虫,这些是跟着韦玮老师的书走的。不同的是,我比较喜欢按自己的思路做实现,然后再对比韦玮老师书中的实现,找到自己的不足和差距。
这周做下来,发现小爬虫的框架差距不大,基本就是反爬绕过 –> 页面数据抓取 –> 正则提取目标元素 –> 保存数据,所以上面这几个爬虫的实现主要是正则和一小部分流程不同,大体一致。不过相信这也是我目前还没真正入门进到真正爬虫导致,相信后面学习的过程,将会接触更多好玩的东西。
这次分享的是我写的一个微信文章爬虫,具备了以下功能,我还会进一步迭代和优化,希望这个玩意做得好玩一些。也希望大家吐槽下这个实现,给些建议交流下,感谢。
- 自动抓取代理IP和更新
- Cookie自动保存重装载
- 部分简单的容错处理
- 通过搜狗引擎查找并抓取微信文章
下面的code可以看出有一些函数没做实现,比如图片保存、页面链接自动产生等。我这周末事情多,所以才没整完。原计划是实现url保存成mhtml格式,这样抓取到的文章和图片能一起保存下来,我争取这周做出来,然后分享。
上周的练习也让我看到自身不少薄弱的地方,所以后续会想办法加强起来,才能提高code质量和价值。
#!/usr/local/bin/python3#-*- coding: utf-8 -*-__author__ = 'donald.zhuang'import urllib.requestimport http.cookiejarimport randomimport reimport osimport socket# for collecting proxy addressUrl_ProxyAddr = 'http://www.xicidaili.com/nn''''抓取代理ip地址的正则'''RegExp_ProxyAddr= '<tr class=.*?<td>(.*?)</td>\s+<td>(.*?)</td>.*?(HTTPS?)</td>' # for ArticleUrlTemp = 'http://weixin.sogou.com/weixin?query=%s&type=2&page=%d'KeyWd_Page = 1KeyWd_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', }# cookieCookie = NoneCookieFile = 'cookie.txt'# global VariblessetProxyAddr = []def Get_ProxyAddr(): '''获取代理IP地址,采用的是http://www.xicidaili.com/nn,不过质量略差''' global setProxyAddr try: req = urllib.request.Request(Url_ProxyAddr, None, Headers) except: print('[DBG ERR ] Get proxy address error.') return setProxyAddr data = 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, CookieFile CookieProcessor = None ProxyHandler = 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, CookieFile try: req = urllib.request.Request(PageUrl, None, Headers) content = urllib.request.urlopen(req, timeout = 30) # set Timeout as 10s except 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) return except socket.error as SocketErr: print('[DBG ERR ] Sokect Error: ', SocketErr) return except requests.exceptions.RequestException as ReqErr: print('[DBG ERR ] RequestException') return else: 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, CookieFile req = 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 Text while 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()
阅读全文
1 0
- 微信文章爬虫demo -- 综合实验和练习
- 微信综合练习
- 实验4-9 综合练习
- 实验5-8 综合练习
- 170407 汇编-综合练习 实验7
- 附加实验2 OpenGL变换综合练习
- 微信分享好友和朋友圈demo
- 微信分享好友和朋友圈demo
- 综合练习: 九九乘法表和排序
- JSP+Javabean+Servelt综合分demo(学校实验第三天)
- 读后感1《微信视频和文章》
- 综合Demo
- JTree 和 JTable 的综合应用 Demo
- 微信JSSDK-demo
- 微信支付demo
- 微信支付demo
- 微信开发DEMO
- 微信支付demo
- dhcp配置 错误处理(1)
- 获取set()和push()方法向值栈放的数据
- 4.3 Layout的设计
- kbe的UE4的demo大体解读
- jquery 淡入淡出以及获取slideToggle状态
- 微信文章爬虫demo -- 综合实验和练习
- 航信概要设计-4
- asp链接excel2016
- js刷新页面方法大全
- Linux关机和重启和其他命令
- Dijkstra与Floyd 最短路问题
- 限时等待锁
- laravel 的日志记录访问者访问的资源和用户ip,及查询的内容
- Spring-boot实例学习之 自定义starter