Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

寻求志同道合的人一起来改进 #1

Open
3 of 10 tasks
yijingping opened this issue Sep 20, 2016 · 50 comments
Open
3 of 10 tasks

寻求志同道合的人一起来改进 #1

yijingping opened this issue Sep 20, 2016 · 50 comments

Comments

@yijingping
Copy link
Member

yijingping commented Sep 20, 2016

如果你对本项目感兴趣,愿意参与进来,请在这里留言告诉我.
下面是接下来要实现的功能(打钩的表示已认领,未打钩表示未认领)

文档:

  • 安装文档
  • 使用文档
  • 开发文档(项目架构、工作原理、如何二次开发等)

重要功能:

  • 将scheduler、downloader、extractor、processor做成可配置的,想用哪个就在settings中配置,以便满足不同的爬取需求。
  • 开发浏览器插件,用于配置“解析html”的规则。
  • 测试(单元测试和持续集成测试)

碎片功能:

  • 提高爬取速度(异步io)
  • 图片和视频文件可以存储在本地,或者只存url
  • 详情页图片显示原图,而非白板图
  • 获取阅读数和点赞数

如果你有感兴趣的项,或者特别想要实现的功能,可以在这里留言告诉我,我会回复你。

具体合作开发流程:
1) 选择你感兴趣的项,留言告诉我。我会将该模块分配给你。
2)你fork我的项目,修改后给我提交pull request
3)我review和merge你的代码,并在贡献者名单中加上你

@ghost
Copy link

ghost commented Sep 20, 2016

有兴趣,请问参与后具体的合作开发流程有成型的想法吗?

@yijingping
Copy link
Member Author

@Leonard-Peng 方案马上就出来了,正在考虑中

@Mingyi
Copy link

Mingyi commented Sep 20, 2016

全职做过公益,也自己写过简单的爬虫,2.7版本几乎没用过,可以出3.5的版本吗?

@lszxlong
Copy link

微信爬虫我也写过,目前也在运行中..希望有时间可以加入

@ybbz
Copy link

ybbz commented Sep 21, 2016

感兴趣,求上车!

@yijingping
Copy link
Member Author

@Mingyi 因为之前一直用的2.7版本,所以沿用至今。你可以将这个项目升级成支持3.x的

@xdstack
Copy link

xdstack commented Sep 21, 2016

赞一个先。👍

@onestarshang
Copy link

能启动页面,但是感觉并没有爬取。。。。怎么进行爬虫的爬取?

@yijingping
Copy link
Member Author

yijingping commented Sep 21, 2016

@onestarshang 在bin下面有4个脚本:
scheduler.py 任务计划
downloader.py 下载
extractor.py 解析html
processor.py 存储到数据库
需要启动,才会爬取

@feynmanloo
Copy link

感兴趣,求上车!

@onestarshang
Copy link

@yijingping
我去看看

@anyforever
Copy link

怎么解决的微信验证码?

@mlzxy
Copy link
Contributor

mlzxy commented Sep 21, 2016

有兴趣!上车! 会先去看看这几个文件:

scheduler.py 任务计划
downloader.py 下载
extractor.py 解析html
processor.py 存储到数据库
需要启动,才会爬取

@guotie
Copy link

guotie commented Sep 22, 2016

启动了也没发现爬到数据啊

@yijingping
Copy link
Member Author

@anyforever 如果碰到验证码,就放回下载队列重试,直到碰到没有验证码的。 因为使用了代理池,所以总会碰到没有验证码的。

@yijingping
Copy link
Member Author

@guotie 你有什么报错吗? 另外,是否添加了要爬取得公众号 或者 文章关键字

@ivlucks
Copy link

ivlucks commented Sep 23, 2016

后台的样式没有

@gswf-sha
Copy link

gswf-sha commented Sep 23, 2016

为慈善做贡献,本菜鸟心有余,无奈力有点力不足。刚刚开始啃scrapy和flask。想请教一个关于微信爬虫的问题:一般爬虫如Scrapy用的都是URRIM流程,需要有一个starting Url, 然后开始 Request ->Response -> Items ->more URLs循环,但做微信爬虫好像没法这么来。能简单介绍一下您这个虫虫的原理吗?

@yijingping
Copy link
Member Author

@ivlucks 如果你用runserver跑,应该有样式。 如果是其它方式,需要执行 manage.py collectstatic

@yijingping
Copy link
Member Author

其实原理是一样的。 只是搜狗微信反爬虫机制比较强,需要加代理池、原生浏览器解析、失败重试、按照一定的顺序爬取等机制,灵活性高一点。这也是我不用scrapy的原因。

1 先上一张该项目的架构图。
wechatimg8

流程就是这样:

  1. “任务计划器” 从数据库获取要爬取的公众号和关键字,并更新下次爬取时间。 放入“下载队列”。
  2. “下载器” 从 “下载队列” 获取公众号和关键字,去 搜狗微信 爬取。 将爬取到的html放入“抽取队列”
    3)“抽取器” 从 “抽取队列” 获取html,并解析成 数据库字段(标题、内容、发布时间等)。放入 “存储队列”
    4)“数据存储器” 从 “存储队列” 获取记录,存入数据库或者文件

中间用了消息队列,所以可以做到分布式 和 高并发

2 “去搜狗微信爬取” 的过程

1) 从代理池,获取一个代理ip
2)启动浏览器
3)访问搜狗微信首页
4)输入公众号id或者关键词,点击搜索
5.1)如果是搜公众号id,进入公众号列表页,找到公众号,点击进入文章列表页
5.2) 如果是搜关键词,直接进入文章列表页
6)点击每一篇文章,获取html
7)如果在第 3)4)5)步失败,则将本次爬取任务,重新丢回“下载队列”,并记录重试次数。

@anyforever
Copy link

@yijingping 原来是用了代理池啊。

@onestarshang
Copy link

OSS2_CONFIG 这个,不用阿里云的 oss,怎么配置这个呢?
在添加公众号的时候报错。。。

ServerError at /wechat/add/
{}
Request Method: POST
Request URL:    http://localhost:8001/wechat/add/
Django Version: 1.8.1
Exception Type: ServerError
Exception Value:    
{}
Exception Location: /usr/local/lib/python2.7/site-packages/oss2/api.py in _do, line 148
Python Executable:  /usr/local/opt/python/bin/python2.7
Python Version: 

@YiuChoi
Copy link

YiuChoi commented Sep 24, 2016

@onestarshang 同样的问题,我就想部署在自己的服务器上,也保存在自己的服务器上

@yijingping
Copy link
Member Author

我尽快加一下这个功能。 可以有选择的存储在本地或者只存图片url

@ivlucks
Copy link

ivlucks commented Sep 26, 2016

请教大神,能否抓取ajax生成的数据(同一个页面.有些数据再用ajax抓取)

@vsens
Copy link

vsens commented Sep 26, 2016

两个问题请教,1、这个如果要部署在公网服务器上,环境是desktop版本的系统么?2、代理状态: 异常,请问是什么原因?3、如果想把视频和图片存本地要怎么修改local_settings.py?

不好意思,我只是一个不怎么懂技术的产品,问题略low,还望不吝赐教。

@yijingping
Copy link
Member Author

@ivlucks 后面会将scheduler、downloader、extractor、processor都做成可配置的。你这个自定义的功能可能需要自己实现一个downloader或者extractor类。

@yijingping
Copy link
Member Author

@vsens
1 如果不是desktop版本,需要安装 xorg-x11-server-Xvfb 和 firefox,我在 Readme 的安装过程中写了。

2 如果添加代理ip,请先自动忽略这个提示。 后面我改过来

3 视频和图片存本地的功能,我没有实现。 目前都是存在阿里云的oss上,或者不存储。有好几个人提到这个功能,我决定后面实现。

@yijingping
Copy link
Member Author

yijingping commented Sep 26, 2016

@vsens 现在主要是用到了oss,你没有配置,所以出错了。 我正在修改一份不用oss的。一会传上来。

现在发现很多人在安装环节,遇到一些问题,十分抱歉。

@yijingping
Copy link
Member Author

@vsens 已经更新了代码,默认不使用OSS。请pull最新的代码,并按照readme的步骤重新配置一下。

@vsens
Copy link

vsens commented Sep 27, 2016

@yijingping 辛苦了

@onestarshang
Copy link

更新速度真快~!!!

@yijingping
Copy link
Member Author

如果安装或者使用过程遇到问题,直接加我微信 jingpingyi

@onestarshang
Copy link

试用了一段时间,有一个很疑惑的问题:为什么要调用浏览器进行抓取呢?

@yijingping
Copy link
Member Author

@onestarshang 搜狗微信反爬虫比较厉害,规则也经常改。遇到的问题有:
1)很多是ajax请求。 如点赞数和阅读数。
2)一些信息需要在页面中js处理过才会展示。 如图片等。
3)文章url都是临时的url,有时效性的。 如 http://mp.weixin.qq.com/s?src=3&timestamp=1477546925&ver=1&signature=8121GEQzyGnJh689VdQSpz-qbsIIyCfJcmIWX6bEhSjiRBAvqnhE0GdDuR3fyDNGfsSeG0RIZRqsOhQyRsSxSNe32lbvEXMy8TzpEma8et0BdDZabwc0ihyw9*bPpfJ09lHM8wNaoCRQrNIAX2H1WPs1l42oWe0zJ1-L0LkxJes=

用requets之类的库请求,要么直接被屏蔽,要么需要写太多规则,还经常因为改版而修改。
所以我为了图省事,完全模拟人工点击,然后直接对渲染后的网页源码处理。
你也可以试试phantomjs、或者QT Browser来爬取。

@nolanzhao
Copy link

我抓取过公众号,可以生成永久链接。

@yijingping
Copy link
Member Author

我记得4月份的时候,微信搜狗显示的是永久链接,现在是临时的了。
@nolanzhao 请问下永久链接的生成规则是怎样的呢?

@nolanzhao
Copy link

html = get_html(temporary_link)
pattern = r'var (biz =.?".?");\s_var (sn =.?".?");\s_var (mid =.?".?");\s_var (idx =._?".*?");'
params = re.findall(pattern, html)
if len(params) == 0:
return None
p = {i.split('=')[0].strip(): i.split('=', 1)[1].strip('|" ') for i in params[0]}
params = urlencode(p)

true_link = "http://mp.weixin.qq.com/s?" + params

@nolanzhao
Copy link

临时链接加上这个后缀就可以在浏览器打开
&ascene=1&uin=NDg0OTE5MjE1&devicetype=android-19&version=26031732&nettype=WIFI&pass_ticket=GROZ8lOOblgWTu7HOjfLDab55ueQRwEosuN0nZV6M%2BaUZ41GNnXH3VmrP3FsZNxP

@guotie
Copy link

guotie commented Nov 7, 2016

sn加密的规律是什么

@yijingping
Copy link
Member Author

@nolanzhao 现在biz、sn、mid、idx不能用上面的方式获取了吧。 能否提供一个现在能用的获取代码?

我看了下html源码里面只有这里有这些字段,但是获取不到值。

image

@onestarshang
Copy link

哦,原来是这样,我抓的时候也发现有时效性,然后我是 download html 到本地,图片和文字分开抓取~【我主要是抓一些图片~~哈哈
学习了感谢解答

@sundy-li
Copy link

赞一个, 这个微信爬虫工程化比较完善

但是从数据源来说, 搜狗微信还是有些限制, 太受限微信搜狗的规则, 还有验证码, 并且不能爬取公众号的所有文章, 作者有没有兴趣将这个爬虫改为 直接从微信源来爬取
我这里有一个小的核心功能实现, 基于中间人攻击的方式, https://github.com/sundy-li/wechat_spider , 目前已经可以批量爬取微信公众号的所有历史文章, 但是在批量自动关注这里还是没做到自动化

期待也能整合进去做一个全自动化的爬虫项目,保持交流

@yijingping
Copy link
Member Author

@sundy-li 看了下你的项目,觉得这个思路很有意思,能解决很多微信搜狗的痛点。 一起研究下 加下我微信 jingpingyi

@nwangwei
Copy link

@sundy-li 你们一个go,一个python,我是Java。现在新版微信也使用https了,目前应该没有客户端证书验证,所以类似Charles(代理)这类自建证书并且根信任就能做https代理了。如果是PC端批量模拟点击爬虫,针对公众号的文章应该问题不大,包括历史文章,但是留言如果只限制到客户端并且证书验证,那么hack成本就直线上升了,因为浏览器看不了的话,URL都很难取到了。

@sundy-li
Copy link

@nwangwei 其实语言选型都差不多, 关键是实现的原理才是核心.
从目前来看, 代理抓取是比较稳定的,但需要解决以下难点

  1. 批量化爬取, 微信关注的公众号有上限, 关注后才可以抓取所有历史链接, 所以 需要管理多个测试号,目前用了adbshell来自动化关注, pyautogui来模拟点击
  2. 测试号还会经常被微信查出异常受屏蔽, 需要频繁更换
  3. https自建证书还是可行的, 目前我那份代码还不支持https,还在往这个点迁移

@nwangwei
Copy link

@sundy-li 我的需求只是一个或几个公众号,所以比你们通用的简单多了,只是我要获取评论和历史文章,所以解析html和json比较有针对性。我基本就关注那3个关键参数,代理的目的也是为了获取那3个参数。下面那篇文章你看过么?是自动获取3个参数的思路,然后针对性解析网页爬取所需内容,其实也是代理的思路。http://stackbox.cn/2016-07-21-weixin-spider-notes/
解决了历史文章的话,从搜狗那边获取最近的还是更方便吧。

@sundy-li
Copy link

@nwangwei 我那个spider项目也受 http://stackbox.cn/2016-07-21-weixin-spider-notes/ 思路启发而开发的, 目前已经支持http,https,自动化模拟脚本能 拦截各个平台客户端的请求进行存储, 那三个参数都不存储, 全是和客户端一致, 原理上是一样的

@nikonee079
Copy link

@Songdongdong6 忍不住登录一下来喷你 没有参与 就要这个要那个 你的工资我帮你领吧?

@ghost
Copy link

ghost commented Jul 30, 2018

@nikonee079 我只是问一下能或者不能,你这话有点太多了吧!!!!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests