全自动文章采集网源码2020(搜狗微信改版了,无法通过搜索公众号名字获取对应文章)

优采云 发布时间: 2021-10-25 08:08

  全自动文章采集网源码2020(搜狗微信改版了,无法通过搜索公众号名字获取对应文章)

  前言:一觉醒来,发现原来的搜狗微信爬虫失败了。网上一搜发现搜狗微信的版本是10月29号改版的,搜索公众号名称无法得到对应的文章,但是搜索主题还是可以得到对应的文章,问题不大,加油吧!

  目的:获取搜狗微信搜索话题返回的文章。

  涉及防爬机制:cookie设置,js加密。

  完整代码已经上传到我的github,仅供参考。如果对你有帮助,请给我一个star!

  进入标题。

  流程一:正常例行流程

  打开搜狗微信,在搜索框中输入“超人”。我们在这里搜索的是与“超人”主题相关的各种公众号的文章列表:

  

  按照正常的采集流程,按F12打开浏览器的开发者工具,使用选择工具点击列表中文章的标题查看文章@的位置>url 在源代码中的列表中。然后使用xpath获取文章url的值,也就是这个href的值。为了避免混淆,我们称之为“文章列表页面的url”。

  

  可以看到“文章列表页的url”需要拼接。在这种情况下,需要在浏览器中正常访问这个文章,并对比观察跳转后的url(我们称之为“真正的文章url”),只要补上头部和脚。下面是两个网址的对比:

  列表页面的文章url:

/link?url=dn9a_-gY295K0Rci_xozVXfdMkSQTLW6cwJThYulHEtVjXrGTiVgSwqn5HZrcjUNFzn4G2S0Yt3MduzuCU92ulqXa8Fplpd9CqUiLuEm9hLLvBiu5ziMS196rgHYb-GzQfleG917OgwN_VAAdAZHKryCeU9lIxtWTKn*敏*感*词*csuPIjLhLEK3tbGSa3_pkMzadQg75Zhmxb9YI0psZvVepKtN4hpzQgtGa2iOlKKLwV_oxooGE6sxg1qinKxTb5VwJUcLBM1RgkzAPRtmyIGw2VAg..&type=2&query=%E5%92%B8%E8%9B%8B%E8%B6%85%E4%BA%BA&k=92&h=z

真实的文章url:

https://mp.weixin.qq.com/s?src=11&timestamp=1573092595&ver=1959&signature=FjD709D-0vHSyVgQyXCS-TUAcnT0M9Gx6JljQEb6O55zpuyyDaTHqgkRCxNDtt5ZDifDRUUBOemzxcz71FMOmO88m6RWfR0r4fFBe0VefAsjFu0pl-M0frYOnXPF5JD8&new=1

  很明显,两个url的路径不一致。中间应该有一些转移。python的requests库具有自动传输功能。我们先尝试访问域名。

  

  很明显,这里已经做了防爬的限制,所以从这里开始,我们需要抓包分析。这里使用的工具是火狐浏览器的开发者工具。抓包就是观察从搜索结果页面列表文章点击页面跳转到页面文章的过程,这里点击文章超链接会在新窗口打开,我们只需要在网页源代码中将对应的a标签的target属性改为空,就可以在一个窗口中观察整个过程的数据包。

  流程二:抓包分析的跳转实现

  

  抓包分析:

  

  

  通过抓包,我们可以发现搜索结果页面跳转到文章页面的过程。这里我们观察到“文章列表页面的url”返回的结果收录“真实的文章url”信息,也就是说我们只需要正确访问“文章url列表页面”,根据返回的数据,我们可以拼接出“真实的文章url”并访问。我们实现了从“列表页的文章url”到“真实的文章url”的跳转!

  过程3:无法访问手动获取的列表页面的“文章url”进行抓包分析

  这时候我们的目标已经从获取“真实的文章url”变成了正确访问“列表页面的文章url”,继续分析“列表页面的文章” "在捕获的数据中。@>url”信息:

  抓包数据:

  url:https://weixin.sogou.com/link?url=dn9a_-gY295K0Rci_xozVXfdMkSQTLW6cwJThYulHEtVjXrGTiVgSwqn5HZrcjUNEnNekGBXt9LMduzuCU92ulqXa8Fplpd9CqUiLuEm9hLLvBiu5ziMS196rgHYb-GzQfleG917OgwN_VAAdAZHKryCeU9lIxtWTKn*敏*感*词*csuPIjLhLEK3tbGaBLLLEV3E0vo604DcwbvX2VNudQZNnBemevd34BJP94ZL5zUiA49LgzIjRlpGxccVxTTaLhHZKstaeqw41upSVAe0f8bRARvQ..&type=2&query=%E5%92%B8%E8%9B%8B%E8%B6%85%E4%BA%BA&k=60&h=U

  method:GET

  请求参数:{"url":"dn9a_-gY295K0Rci_xozVXfdMkSQTLW6cwJThYulHEtVjXrGTiVgSwqn5HZrcjUNEnNekGBXt9LMduzuCU92ulqXa8Fplpd9CqUiLuEm9hLLvBiu5ziMS196rgHYb-GzQfleG917OgwN_VAAdAZHKryCeU9lIxtWTKn*敏*感*词*csuPIjLhLEK3tbGaBLLLEV3E0vo604DcwbvX2VNudQZNnBemevd34BJP94ZL5zUiA49LgzIjRlpGxccVxTTaLhHZKstaeqw41upSVAe0f8bRARvQ..","type":"2","query":"咸蛋超人","k":"60","h":"U"}

  headers

    Host: weixin.sogou.com

    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0

    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

    Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2

    Accept-Encoding: gzip, deflate, br

    Connection: keep-alive

    Referer: https://weixin.sogou.com/weixin?type=2&query=%E5%92%B8%E8%9B%8B%E8%B6%85%E4%BA%BA&ie=utf8&s_from=input&_sug_=n&_sug_type_=1&w=01015002&oq=&ri=1&sourceid=sugg&sut=750912&sst0=1573092594229&lkt=0%2C0%2C0&p=40040108

    Cookie: 见下

  Cookie:{"ABTEST":"4|1573094886|v1","IPLOC":"CN4401","JSESSIONID":"aaa3VBk4eXnIf8d4bdx4w","SNUID":"57A28ED20A0F9FB2BBE3E0180AF00D25","SUID":"5EAB87DB2613910A000000005DC385E6","SUV":"00F221C2DB87AB5E5DC385E7B*敏*感*词*3F633"}

  这里有三个重要的点:

  请求参数:对比我们获取到的“文章url of the list page”的分析,发现多了两个参数“k”和“h”,需要尝试获取。headers:经过测试,这个网站对User-Agent敏感,需要User-Agent在访问前后保持一致。Cookie:需要获取Cookie中的参数才能正确访问url。这些参数是:ABTEST、IPLOC、JSESSIONID、SNUID、SUID、SUV。

  3.1:获取参数“k”和“h”

  根据经验,从一个url转换到另一个url有两种​​情况:跳转和javascript字符串处理。经过多次抓包分析,发现搜索结果页面点击了文章超链接到我们当前的目标URL,并没有重定向。抓包数据中的“文章url of the list page”和我们得到的list page的“文章url”可以判断是同一个url,所以猜测是经过处理的通过 javascript 字符串。经过一番搜索,我在搜索结果页的源代码中发现了一段非常可疑的代码:

  

(function(){$("a").on("mousedown click contextmenu",function(){var b=Math.floor(100*Math.random())+1,a=this.href.indexOf("url="),c=this.href.indexOf("&k=");-1!==a&&-1===c&&(a=this.href.substr(a+4+parseInt("21")+b,1),this.href+="&k="+b+"&h="+a)})})();

  其中最重要的代码是:this.href+="&k="+b+"&h="+a,这段代码是在a标签的href属性的内容中添加"&k=","&h="当点击事件发生时,就是这段代码加密并在url的参数中添加js。我们只需要在python中实现这段代码就可以解决这个问题,下面是python的实现代码:

  def get_k_h(url):

  b = int(random.random() * 100) + 1

a = url.find("url=")

url = url + "&k=" + str(b) + "&h=" + url[a + 4 + 21 + b: a + 4 + 21 + b + 1]

  reuturn url

  3.2:获取cookie的参数

  观察抓包数据,可以发现我们第一次访问时并没有带任何cookie,但是经过一系列的请求,到我们的目标请求,浏览器已经通过返回数据包的Set-Cookie属性构造了Cookie之前的请求。出来了,我们要做的就是在从头开始构建Cookie的过程中找到所有带有SetCookie属性的ResponseHeaders,参数就是我们需要的参数,再次模拟访问,就可以得到所有的参数并构建出来我们现在需要饼干。

  

  比如搜狗微信搜索界面请求的ResponseHeaders有5个Set-Cookie字段,其中ABTEST、SNUID、IPLOC、SUID是我们最终构造Cookie所需要的参数(对比上次的Cookie值,可以发现这里的 SUID 值并不是我们最终需要的,我们将在后面的数据包中继续探索)。

  经过分析,我们可以在四个请求得到的ResponseHeaders之后正确构造Cookie:

  1. 得到ABTEST、SNUID、IPLOC、SUID:

  https://weixin.sogou.com/weixin?type=2&query=%E5%92%B8%E8%9B%8B%E8%B6%85%E4%BA%BA&ie=utf8&s_from=input&_sug_=n&_sug_type_=1&w=01015002&oq=&ri=1&sourceid=sugg&sut=750912&sst0=1573092594229&lkt=0%2C0%2C0&p=40040108

2. 需要IPLOC、SNUID,得到SUID:

  https://www.sogou.com/sug/css/m3.min.v.7.css

3. 需要ABTEST、IPLOC、SNUID、SUID,得到JSESSIONID:

  https://weixin.sogou.com/websearch/wexinurlenc_sogou_profile.jsp

4. 需要IPLOC、SNUID、SUID,得到SUV

  https://pb.sogou.com/pv.gif

  这四个请求可以根据之前请求中获取到的Cookie参数,构造出他们需要正确访问的cookies。值得注意的是,对于最后一次请求,除了正确拼接cookies外,还必须获取正确的请求参数才能正常访问:

  

  这种参数查找可以使用浏览器的全局搜索功能。经过一番搜索,你会发现这里需要的所有参数都已经在搜索结果页面的源码中返回了。使用常规规则来解析这些参数。:

  

  然后根据这些解析出来的参数和前三个请求得到的Cookie参数,就可以正确访问第四个请求,得到所有需要的Cookie参数!

  流程四:构造正确的请求信息

  至此,我们已经分析了正确模拟请求的所有流程,并整理出来:

  获取“k”和“h”参数,传入从搜索结果页面得到的“文章ur of the list page”,调用get_k_h()。获取需要的Cookie参数,构造正确的Cookie,根据第三个过程中给出的4个URL构造获取ResponseHeaders中SetCookie的请求。构造一个正确的请求来访问“文章列表页面的url”。根据3中请求返回的数据,拼接“真实的文章url”,这是第二个过程。请求“real 文章url”获取真实的文章页面数据。

  至此,所有的分析都结束了,可以愉快的写代码了!

  结论:本次采集涉及的防爬技术是Cookie构造和简答js加密。不难,最重要的是耐心和细心。另外提醒大家要遵守爬虫伦理,不要对他人造成伤害网站,平安!

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线