有关于CSDN页面爬取破解的两个爬虫(编写时间20200104)

2024-03-05 18:58

本文主要是介绍有关于CSDN页面爬取破解的两个爬虫(编写时间20200104),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

由于课程设计需要编写了一系列爬虫,期中包括:
  • 博客园页面+博客园搜索
  • 百度搜索+百度文库
  • 简书搜索+简书页面
  • 爱学术搜索
具体目的就详细说明,反正就搜集一下资料和URL
下为CSDN的两个爬虫(编写时间20200104)
事先声明:CSDN页面爬虫并未完全破解,所以需要隔一段时间取一下cookie(根据其生存周期?)
  • 首先是CSDN页面爬虫

  • 使用前需要获取cookie中的acw_sc__v2加密码(暂时没破解,因为溯源会进入debug黑洞,比较麻烦,待完善)

  • 获取方式如下:
    在这里插入图片描述

  • 打开CSDN博文,Network模式下DOC,先Clear再刷新页面
    在这里插入图片描述

  • 找到第一个纯数字的那个doc,点开,cookie下找到
    在这里插入图片描述

  • 找到acw_sc__v2的value,加到header中的cookie中去,即可用爬虫得到真实页面

  • 下面是代码

import requests
import time
from lxml import etree
import random
import os
import jsonheaders = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36","accept-language":"zh-CN,zh;q=0.9,en;q=0.8",# "cookie":"acw_sc__v2=5e0c4608eda0369b627288eebf26ea9b0d11bcbb""cookie":  "acw_sc__v2=5e0c90c2e2e885ed5748dbfaf6b26a12f0aad2e0"}def getContent(url):try:req = requests.get(url,headers = headers)req.encoding = req.apparent_encoding# print(req.text)html = etree.HTML(req.text)title = html.xpath("//*[@id='mainBox']/main/div[1]/div/div/div[1]/h1/text()")content = []for each in html.xpath("//*[@id='content_views']/*"):con_temp = each.xpath("string(.)")if  con_temp:content.append(str(con_temp))con_temp = each.xpath("img/@src")if con_temp:for eImg in con_temp:content.append("![]({})".format(eImg))return title,contentexcept:return "",""def save(title,content,name):with open("{}.md".format(name),'w',encoding='utf-8') as f:f.write(str(title[0])+'\n\n')for each in content:f.write(each+'\n')if __name__ == '__main__':url = "https://blog.csdn.net/w746805370/article/details/51312248"# 3SAT规约到独立集url = "https://blog.csdn.net/xiazdong/article/details/8258092"# 【NPC】3、3SAT规约到顶点覆盖url = "https://blog.csdn.net/xiazdong/article/details/8258086"# 证明题NP难问题:3SAT-------》独立集name = "3SAT-独立集"url = "https://blog.csdn.net/u010499172/article/details/73920646"# 几个NP-完全问题的证明name = "几个NP-完全问题的证明"url = "https://blog.csdn.net/kufaaa/article/details/54630460"title,content = getContent(url)if title is not "":save(title,content,name)else:print("访问出错,请更换acw码或者确认url试试")# 使用说明:由于CSDN中的加密机制,因此就算是静态页面,没有acw加密的码也拿不到真实数据# 故此使用时需预先获取acw_sc__v2码,它存在一定的时效性,具体获取方法见README
  • 接下来是中规中矩的CSDN搜索爬虫
    在这里插入图片描述
  • 这个就比较简单,没什么特别的反爬措施,直接上就完事了
import requests
import time
from lxml import etree
import random
import os
import json
import utils.Utils as sqheaders = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"
}proxy_list = ['117.90.131.247:8118','171.11.32.77:9999','223.199.31.112:9999','27.191.234.69:9999','223.199.31.5:9999','60.167.135.179:9999'
]def getContent(word, proxy, page, content):print("当前第{}页".format(page))try:url = "https://so.csdn.net/so/search/s.do?p={}&q={}&t=blog&viparticle=&domain=&o=&s=&u=&l=&f=&rbg=0".format(page,word)re = requests.get(url=url, headers=headers, proxies=proxy)html = etree.HTML(re.text)tit_list = html.xpath("//dl[@class='search-list J_search']")# print(len(tit_list))for each in tit_list:temp_url = each.xpath(".//div[@class='limit_width']/a[1]/@href")[0]temp_title = each.xpath(".//div[@class='limit_width']/a[1]")[0].xpath("string(.)").replace("\"","").replace("\n","").replace(")"," ").replace("("," ").replace("\\","")temp_content = each.xpath(".//dd[@class='search-detail']")[0].xpath("string(.)").replace("\"","").replace("\n","").replace(")"," ").replace("("," ").replace("\\","")# print("temp_url={}\ntitle={}\ncontent={}\n\n".format(temp_url, temp_title,temp_content))content.append([temp_url,temp_title, temp_content])if int(html.xpath("//span[@class='page-nav']/a/@page_num")[-1]) > page:time.sleep(random.uniform(0, 2))return getContent(word=word, proxy=proxy, page=page+1, content=content)except:print("访问出错")return contentdef do(word):proxy = {"http": random.choice(proxy_list)}content = getContent(word=word, proxy=proxy, page=1, content=[])# for each in content:#     print("url={}\ntitle={}\ncontent={}\n\n".format(#         each[0], each[1], each[2]))print(len(content))sq.insert_into_inital_data(content, "CSDN")
if __name__ == '__main__':word = "3sat"do(word)
总结
  • CSDN这个吧,感觉是有点难度,不过花点时间应该不是问题,那个cookie给我的感觉就像之前写过的简书一样,需要先访问一次获取,只是我在这样操作的时候陷入debug黑洞,后来,后来就偷了个懒。

这篇关于有关于CSDN页面爬取破解的两个爬虫(编写时间20200104)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/777492

相关文章

Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码

《Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码》:本文主要介绍Java中日期时间转换的多种方法,包括将Date转换为LocalD... 目录一、Date转LocalDateTime二、Date转LocalDate三、LocalDateTim

golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法

《golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法》:本文主要介绍golang获取当前时间、时间戳和时间字符串及它们之间的相互转换,本文通过实例代码给大家介绍的非常详细,感兴趣... 目录1、获取当前时间2、获取当前时间戳3、获取当前时间的字符串格式4、它们之间的相互转化上篇文章给大家介

Feign Client超时时间设置不生效的解决方法

《FeignClient超时时间设置不生效的解决方法》这篇文章主要为大家详细介绍了FeignClient超时时间设置不生效的原因与解决方法,具有一定的的参考价值,希望对大家有一定的帮助... 在使用Feign Client时,可以通过两种方式来设置超时时间:1.针对整个Feign Client设置超时时间

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

Java实现时间与字符串互相转换详解

《Java实现时间与字符串互相转换详解》这篇文章主要为大家详细介绍了Java中实现时间与字符串互相转换的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、日期格式化为字符串(一)使用预定义格式(二)自定义格式二、字符串解析为日期(一)解析ISO格式字符串(二)解析自定义

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

C语言实现两个变量值交换的三种方式

《C语言实现两个变量值交换的三种方式》两个变量值的交换是编程中最常见的问题之一,以下将介绍三种变量的交换方式,其中第一种方式是最常用也是最实用的,后两种方式一般只在特殊限制下使用,需要的朋友可以参考下... 目录1.使用临时变量(推荐)2.相加和相减的方式(值较大时可能丢失数据)3.按位异或运算1.使用临时

Python如何获取域名的SSL证书信息和到期时间

《Python如何获取域名的SSL证书信息和到期时间》在当今互联网时代,SSL证书的重要性不言而喻,它不仅为用户提供了安全的连接,还能提高网站的搜索引擎排名,那我们怎么才能通过Python获取域名的S... 目录了解SSL证书的基本概念使用python库来抓取SSL证书信息安装必要的库编写获取SSL证书信息

Android WebView无法加载H5页面的常见问题和解决方法

《AndroidWebView无法加载H5页面的常见问题和解决方法》AndroidWebView是一种视图组件,使得Android应用能够显示网页内容,它基于Chromium,具备现代浏览器的许多功... 目录1. WebView 简介2. 常见问题3. 网络权限设置4. 启用 JavaScript5. D

Flutter监听当前页面可见与隐藏状态的代码详解

《Flutter监听当前页面可见与隐藏状态的代码详解》文章介绍了如何在Flutter中使用路由观察者来监听应用进入前台或后台状态以及页面的显示和隐藏,并通过代码示例讲解的非常详细,需要的朋友可以参考下... flutter 可以监听 app 进入前台还是后台状态,也可以监听当http://www.cppcn