爬虫遇到几个奇怪问题

news/2024/7/19 10:28:49 标签: 爬虫

最近工作需要抓取很多广告推广数据,渠道多账户多,统计比较费劲,就写个爬虫挨着采集入库方便统计。

1、RedirectException: Maximum redirects (50) exceeded

这个问题说个类:

核心代码这个大家一看就懂了,response返回302重定向,结果形成死循环,超过重定向的上限抛异常。

这个可以通过设置是否允许重定向:

 RequestConfig config = RequestConfig.custom().setProxy(crawlerModel.getProxy()).setCircularRedirectsAllowed(true).build();

或者显示重定向次数:

page.getParams().setParameter("http.protocol.max-redirects", "110");

总之这其实不是结果问题的根本。HttpClient自动处理重定向其实给了很多方便。

我的问题是怎么解决的呢?

其实 我也不知道,总是就那么改着改着就报错变成404了。第二个问题

2、404

  httpclient发出请求后,返回html显示404找不到网页,各种检查url没有问题,没办法就有fiddler抓抓包看看。

  idea跟fiddler配置简单说下,下面是网上查到的代码

        System.setProperty("http.proxyHost", "127.0.0.1");
        System.setProperty("https.proxyHost", "127.0.0.1");
        System.setProperty("http.proxyPort", "8888");
        System.setProperty("https.proxyPort", "8888");

        try {
            URL u = new URL(encodeUrl(strUrl));
            try {
                try (InputStream in = new BufferedInputStream(u.openStream())) {
                    InputStreamReader theHTML = new InputStreamReader(in);
                    int c;
                    while ((c = theHTML.read()) != -1) {
                        System.out.print((char) c);
                    }
                }
            } catch (MalformedURLException ex) {
                System.err.println(ex);
            } catch (IOException ex) {
                System.err.println(ex);
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }

然后我就加上了,结果看不到,又各种抓狂。其实把fiddler作为代理来抓包,httpclient设置代理的方式不是这么干的,来个正确的打开方式:

        HttpHost proxy = new HttpHost("127.0.0.1",8888);
        RedirectStrategy redirectStrategy = new SeimiRedirectStrategy();
        RequestConfig requestConfig = RequestConfig.custom().setProxy(proxy).setConnectTimeout(timeout).setSocketTimeout(timeout).build();

然后抓取数据就很稳定的入库了。但是这不是我想要的结果啊,原因还没找到呢,不能用个代理就能出数据啊。总不能还要配置个代理吧。

这个不行就用个更底层的抓包看看wireshark。这个就厉害了!!!

对比下居然是request中设置的headers中Host设置的问题,正确是的三级域名,我设置的是一个二级的域名,然后就404了。

Host头域 
Host头域指定请求资源的Intenet主机和端口号,必须表示请求url的原始服务器或网关的位置。HTTP/1.1请求必须包含主机头域,否则系统会以400状态码返回。 

一个IP地址可以对应多个域名: 一台虚拟主机(服务器)只有一个ip,上面可以放成千上万个网站。当对这些网站的请求到来时,服务器根据Host这一行中的值来确定本次请求的是哪个具体的网站

 

这个之前是真没觉的会影响寻址,费这么大劲,得到这么一个小原因。

3、返回的结果跟预期不一样

  这个其实比较简单了,现在网站都有反爬策略的,如果你模拟的http请求过于简单,会识别问爬虫,返回意料外的结果也不足为奇。

  解决办法就是把头信息设置的全面些。

 

总结:所有问题其实都是模拟的http请求跟爬取网站的真是http请求不一致造成了,细心点总没有坏处

转载于:https://www.cnblogs.com/hughtxp/p/9544054.html


http://www.niftyadmin.cn/n/783921.html

相关文章

关于指针的浅析---------指针基础部分1

关于指针的浅析 下面我们来认识下指针: 1:首先谈一下指针的作用: a:指针是C语言中广泛应用的数据类型,运用指针编程是C语言最主要的风格之一 b:指针能够用来有效表示复杂的数据结构 c:指针能很方便操作数组字符串 d:指针能用于函数传递参数&#x…

二维数组作为参数传递

1.在函数中传递二维数组,可以用指针的形式,也可用数组的形式,但是一定要每一行的长度(也就是列的个数) 例如:int function(char (*p)[10])或者 int function&…

一些语法

def changePrice(self,newPrice): if type(newPrice) is int: self.__price newPrice else: print("本次价格修改不成功") 转载于:https://www.cnblogs.com/chris-jia/p/9557658.html

关于指针的浅析---------指针基础部分2,间接访问和直接访问

指针的直接访问和间接访问&#xff1a; 直接访问:直接通过定义的变量来获取变量的数值 访问:通过指针的形式&#xff0c;指向原来变量存储的值&#xff0c;同样也可以进行修改#include<stdio.h> #include<stdlib.h>int main(int argc,char* argv[]){//定义一个整形…

关于指针的浅析----------指针的运算

C语言指针运算和函数传参数 1:取地址和指针运算符 2:指针赋值运算 3:数组名概念 4:指针的加减运算 5:指针比较运算 取地址和指针运算符 1:取地址运算符&#xff1a; &运算符&#xff0c;返回操作数的内存地址 printf(“%p\n”,&a); 2:指针运算符&#xff1a;…

Docker配置整理

目录&#xff1a; 以非root用户身份管理Docker配置Docker以在启动时启动配置Docker守护程序监听连接的位置以非root用户身份管理Docker 默认情况下&#xff0c;Docker运行权限由用户root所有&#xff0c;而其他用户只能通过sudo使用它。Docker守护程序始终以root用户身份运行。…

函数作为参数传递

1.当函数作为参数传递时&#xff0c;一般使用函数指针 下面是例子 #include<stdio.h>typedef int (*FUNC) (int x, int y);/*定义函数指针&#xff0c;指向参数为int x ,int y 返回值为int的函数*/int func1(int x, int y) /*函数func1,参数为int x ,int y 返回值为int*…

第二战:Xpath爬取静态网页文章内容

本文以爬取第一战文章中获得的各个url为地址&#xff0c;爬取其中文章内容。 先小叙述下xpath的表达式意思 表达式描述nodename选取此节点的所有子节点。/从根节点选取。//从匹配选择的当前节点选择文档中的节点&#xff0c;而不考虑它们的位置。.选取当前节点。..选取当前节点…