网络爬虫--伪装浏览器

news/2024/11/29 20:51:06/

从用户请求的Headers反反爬

  在访问某些网站的时候,网站通常会用判断访问是否带有头文件来鉴别该访问是否为爬虫,用来作为反爬取的一种策略。很多网站都会对Headers的User-Agent进行检测,还有一部分网站会对Referer进行检测(一些资源网站的防盗链就是检测Referer)。针对这种反爬机制,我们可以伪装headers,将浏览器的User-Agent复制到爬虫的Headers中;或者将Referer值修改为目标网站域名或者为上一个请求地址。

分析Chrome的头信息

在这里插入图片描述

访问请求头中包含了浏览器以及系统的信息(headers所含信息众多,其中User-Agent就是用户浏览器身份的一种标识,具体可自行查询)、Referer、Cookie。

代码

引入依赖

        <dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.16.1</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.3.2</version></dependency>
@SpringBootTest
class CrawlerApplicationTest {@Testvoid contextLoads() {Set<String> domainResult = new HashSet<>();String urlStr = "http://ssssss.com/domain";int pageSize = 0;try {for (int i = 0; i < 194994; i++) {String crawlerUrl = "";if (i == 0) {crawler(urlStr, domainResult, null);
//                    crawlerUrl = "http://swkong.com/domain/index" + pageSize + ".html";
//                    System.out.println(pageSize);
//                    System.out.println(crawlerUrl);} else {String referrerUrl = "";if (i == 1) {referrerUrl = "http://ssssss.com/domain";} else {referrerUrl = "http://ssssss.com/domain/index" + (pageSize - 1) + ".html";}crawlerUrl = "http://ssssss.com/domain/index" + pageSize + ".html";crawler(crawlerUrl, domainResult, referrerUrl);System.out.println(pageSize);pageSize += 1;System.out.println(crawlerUrl);System.out.println(referrerUrl);}System.out.println("-----------------------------");}} catch (Exception e) {e.printStackTrace();System.out.println(domainResult.size());System.out.println("catch");} finally {System.out.println(domainResult.size());writeExcel(domainResult);}}public void crawler(String urlStr, Set<String> domainResult, String referrer) throws IOException, InterruptedException {Document parse = sendRequest(urlStr, referrer);Elements dispdomain = Objects.requireNonNull(parse.getElementById("dispdomain")).getElementsByAttribute("href");getDomain(dispdomain, domainResult);System.out.println("请求地址:" + urlStr);System.out.println("__________________________________________");
//        Elements xpage = Objects.requireNonNull(parse.getElementById("xpage")).getElementsByAttribute("href");
//        System.out.println(xpage);
//        String crawlerUrl = "http://swkong.com" + xpage.get(page).attr("href");}public void getDomain(Elements elements, Set<String> result) {for (int i = 0; i < elements.size(); i++) {String attr = elements.get(i).select("a").attr("href");if (attr.contains("?q=")) {String s = attr.split("q=")[1];result.add(s);}}System.out.println(result.size());}public Document sendRequest(String urlStr, String referrer) throws IOException {Map<String, String> cookies = new HashMap<>();cookies.put("cargo_keyword", "xxxxxxxxxxxxxxxxx");cookies.put("PHPSESSID", "xxxxxxxxxxxxxxxxx");cookies.put("language", "zh-cn");if (StringUtils.hasText(referrer)) {return Jsoup.connect(urlStr).timeout(5000).ignoreContentType(true).userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36").cookies(cookies).referrer(referrer).get();}return Jsoup.connect(urlStr).timeout(5000).ignoreContentType(true).userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36").cookies(cookies).get();}public void writeExcel(Set<String> domainResult) {List<DomainDto> resultExcel = new ArrayList<>();for (String domain : domainResult) {DomainDto domainDto = new DomainDto();domainDto.setDomainUrl(domain);resultExcel.add(domainDto);}String path = "D:\\" + System.currentTimeMillis() + ".xlsx";EasyExcel.write(path, DomainDto.class).sheet("域名").doWrite(resultExcel);}

http://www.ppmy.cn/news/1129229.html

相关文章

【MATLAB源码-第40期】基于matlab的D*(Dstar)算法栅格路径规划仿真。

1、算法描述 D*算法路径规划 D*算法&#xff08;Dynamic A*&#xff09;是A*算法的一种变种&#xff0c;主要用于在地图中的障碍物信息发生变化时重新计算路径&#xff0c;而不需要从头开始。该算法适用于那些只有部分信息已知的环境中。 工作原理&#xff1a; 1. D*算法首先…

leetCode 198.打家劫舍 动态规划

198. 打家劫舍 - 力扣&#xff08;LeetCode&#xff09; 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#…

C# 自定义控件库之Lable组合控件

1、创建类库 2、在类库中添加用户控件&#xff08;Window窗体&#xff09; 3、控件视图 4、后台代码 namespace UILib {public partial class DeviceInfoV : UserControl{public DeviceInfoV(){InitializeComponent();ParameterInitialize();}#region 初始化private void Par…

iOS UWB——NI框架部分类

前文介绍iOS中NI框架的实现流程以及简单的应用示例&#xff0c;本文中针对NI框架中的部分类以及相关会话生命周期管理函数进行了简单的介绍。 NI框架关键类 Class NISession class NISession : NSObject概述 NISession类是整个Nearby Interaction类的核心&#xff0c;所有会…

QT--Opencv下报错Mat/imwrite/imread找不到文件

像file not found这类错误 原因是编程系统找不到所指库文件&#xff0c;以此为例&#xff0c;排查自己的每个位置是否有误 1. .pro文件 添加opencv动态库 INCLUDEPATH /usr/include \/usr/include/opencv4 \/usr/include/opencv4/opencv2LIBS /usr/lib/aarch64-linux-gnu…

蓝桥等考Python组别八级003

第一部分:选择题 1、Python L8 (15分) 运行下面程序,输出的结果是( )。 i = 1 while i <= 7: print(i, end = ) i += 1 1 2 3 4 5 60 1 2 3 4 5 61 2 3 4 5 6 70 1 2 3 4 5 6 7正确答案:C 2、Python L8

LOD1.3快速构建 | 多源数据自动化作业、图元和体块模型快速编辑、智能纹理贴图...

2023年&#xff0c;自然资源部先后发布了《实景三维中国建设总体实施方案&#xff08;2023—2025年&#xff09;》、《实景三维中国建设城市三维模型快速构建技术规定&#xff08;征求意见稿&#xff09;》等文件&#xff0c;明确提出&#xff0c;2024年底完成城市三维模型&…

【通意千问】大模型GitHub开源工程学习笔记(2)

使用Transformers来使用模型 如希望使用Qwen-chat进行推理,所需要写的只是如下所示的数行代码。请确保你使用的是最新代码,并指定正确的模型名称和路径,如Qwen/Qwen-7B-Chat和Qwen/Qwen-14B-Chat 这里给出了一段代码 from transformers import AutoModelForCausalLM, Aut…