{"repo":"a252937166/toutiaocrawler","free":true,"listed":false,"github":"https://github.com/a252937166/toutiaocrawler","clone":"git clone https://github.com/a252937166/toutiaocrawler.git","description":"头条号爬虫案例","language":"Java","stars":33,"topics":["toutiao","crawler"],"license":null,"category":"scrapers-browser-automation","readme_excerpt":"项目源码 https://github.com/a252937166/toutiaocrawler.git 爬虫目标 爬取某一头条号下面所有文章。 爬虫设计思路 爬取方式 动态解析网页方式爬取 之前介绍过使用 webdriver 的方式爬取网页内容，这样做的话好处非常明显，只需要考虑如何解析网页的 element 标签就行了，当然弊端也非常明显，就是效率不高。 解析接口方式爬取 没遇到反爬手段逆天的网页，我一般不推荐使用 webdriver 的方式，作为一名技术人员，始终要把项目性能放到第一位，所以这次的项目我选择使用破解今日头条接口的方式去拿取他们的文章。 解析思路 破解入口 以台海网为例，一般大型平台都会有pc和H5两种网页。 pc：https://www.toutiao.com/c/user/50502347096/#mid=50502347096 图(1) h5：http://m.toutiao.com/profile/50502347096/#mid=50502347096 （切换到 文章 的TAB） 图(2) 由 Network 的信息可以得到两个文章接口： pc： https://www.toutiao.com/c/user/article/?page type=1&user id=50502347096&max behot time=0&count=20&as=A1B57ACB48A9D4F&cp=5AB8F92DD4CFBE1& signature=NVHtvxAab.D7OmttJlHb-zVR7a h5： https://www.toutiao.com/pgc/ma/?page type=1&max behot time=&uid=50502347096&media id=50502347096&output=json&is json=1&count=20&from=user profile app&version=2&as=A125DA2BD89A381&cp=5AB81AE3C8116E1&callback=jsonp3 接口对比 很明显，pc端的接口比h5的接口多一个 signature 参数，我私下尝试过破解 signature 的生成方法，结果发现异常复杂，我的前端水平根本搞不定，方法是 window.TAC.sign ，有兴趣的同学可以去试试。 图(3) 无奈只能选择h5的接口了，现在只需要破解 as 和 cp 两个参数就行了。 破解加密参数 参数生成方式 第一部当然是找参数怎么生成的，很遗憾，这一步没有捷径，只能复制好 as 和 cp ，去每一个 js 文件里面匹配，需要一点耐心。 图(4) 解析js 格式化该方法： 不算太难，一个简单的 MD5 加密方式，转成 java 方法也很简单： 分析接口返回值 media id：该媒体ID message：是否成功 next.max behot time：下一页的请求参数 has more：是否有下一页 data.article url：文章的html地址 其他参数都不重要了，这里并没有直接返回文章的内容，下一步就是去原文地址爬取文章内容了。 解析原文地址 基本是个静态网页，直接提取标签里面的内容就行了。 java项目解析 基本功能 为了方便，我使用spring boot框架，设计成了一个web项目，以访问接口的方式启动或者停止爬虫。 队列和线程池 因为是接口的方式启动爬虫，所以不可能等10多万个爬虫任务结束之后再返回成功，只能异步执行任务，所以需要线程池。 光有线程","default_branch":null,"files":null,"tree":[],"storefront":"/r/a252937166","claimed":false,"request_supported":{"post":"https://gitbuyer.com/r/a252937166/toutiaocrawler/request-supported","requests":0},"note":"indexed from public GitHub; nothing is for sale on this page. Clone it from GitHub. Paid listings live at /search."}