这里给大家分享一下最近做微信公众号文章爬虫的经历,其中肯定有许多不好的地方,希望大家斧正交流。
相信大家最近做微信公众号爬虫肯定遇到了很多的问题,其中最大的就是网上很多方法已经不能用了,比如搜狗微信网页端都不能用了,不得不感慨小龙大佬在这方面还是控制的很严的。毕竟现在数据这么值钱,哪能随便就被你爬了去。但是方法还是有的,下面是我这个程序的目录:注意你得先创建一个python的package,因为里面的调度器需要访问这package中的其他py文件
出去里面的picture.py文件,剩下的就是这个爬虫项目的主要结构了:
DataOutput.py:用来将爬取的数据永久化,与数据库有关
HtmlDownloader.py:用来下载页面文档的,你要爬数据最基本就是在文档中用各种正则表达式啊,lxml,html.parser等等各种解析HTML文档的工具。通常静态页面用requests来下载,动态页面的话可以用selenium中的webdriver
HtmlParser:是爬虫中着重需要处理的功能,也就是页面解析,我们需要根据自己的需要来进行解析
UrlManageer.py:用来对URL进行存储,去重,不断给出新的URL用于下一轮爬取,但在这里用处不大
SpiderController:爬虫调度器,用于爬虫开始运行的初始化,启动爬虫
下面开始讲细节:UrlManager.py
"""url管理器"""
class UrlManager:
def __init__(self):
self.new_urls=set()
self.old_urls=set()
def has_new_url(self):
return self.new_url_size()!=0
def get_new_url(self):
new_url=self.new_urls.pop()
self.old_urls.add(new_url)
return new_url
def add_new_url(self,url):
if url is None:
return
if url not in self.new_urls and url not in self.old_urls:
self.new_urls.add(url)
def add_new_urls(self,urls):
if urls is None or len(urls)==0:
return
for url in urls:
self.add_new_url(url)
def new_url_size(self):
return len(self.new_urls)
def old_url_size(self):
return len(self.old_urls)
HtmlDownloader.py:要补充一点,静态页面不等于静态内容,我们要获取的东西如果是通过JavaScript什么的动态生成的话,就需要用到这里的浏览器引擎来进行爬取了。
"""下载器"""
#import requests
#from urllib3 import disable_warnings
from selenium import webdriver
#from bs4 import BeautifulSoup
class HtmlDownloader:
def download(self,url):
if url is None:
return None
#headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, lke Geicko) Chrome/70.0.3538.77 Safari/537.36'}
#headers={'User-Agent':user_agent}在获取静态内容的时候要给requests对象加上请求头
browser = webdriver.Chrome(r'E:\chromedriver\chromedriver.exe')
#r=requests.get(url,headers=head