关于挂梯子爬数据的疑问

2022-02-26 09:47:00 +08:00
 qtoq126

最近刚接触爬虫,想爬一些墙外的数据

有个疑问,目前我的代理是这样设置的

proxies = {
  "https": "http://127.0.0.1:8001",
  "http": "http://127.0.0.1:8001",
}

需要挂着梯子,才可以正常返回数据

但是我理解的是如果我设置一个定时爬虫程序,它应该是跟我的机器环境无关的啊,也就是说,无论我的机器是否是挂着梯子的,程序应该都可以通过增加代理参数正常的返回数据才对?

我尝试着把 proxies 参数设置成挂梯子后的 IP+IP 端口仍然无法正常获取数据

不知道是不是我的方法不对,还是理解有问题,望大佬指点一下,谢谢了

2899 次点击
所在节点    程序员
17 条回复
celeron533
2022-02-26 10:02:03 +08:00
如果你访问的目标不是 http ,而是 socket 之类的,试试看用 socks5 代理。http 代理有局限性。
qtoq126
2022-02-26 10:10:43 +08:00
@celeron533 我就是随便试了几个被墙的网站,都不行,google 、Wikipedia 之类的。

另外我只知道 socks5 端口号,是还是按照 IP+端口号的形式写代理参数吗
opengps
2022-02-26 10:10:55 +08:00
你的机器的公网 ip 可能在对方服务器的黑名单之内
qtoq126
2022-02-26 10:20:19 +08:00
@opengps 我就用家里的电脑试的……
wangyu17455
2022-02-26 10:43:31 +08:00
@celeron533 http connect 可以实现 tcp over http
webshe11
2022-02-26 11:30:16 +08:00
> 但是我理解的是如果我设置一个定时爬虫程序,它应该是跟我的机器环境无关的啊,也就是说,无论我的机器是否是挂着梯子的,程序应该都可以通过增加代理参数正常的返回数据才对?

> 我尝试着把 proxies 参数设置成挂梯子后的 IP+IP 端口仍然无法正常获取数据

什么意思?没看太明白
反正你跑脚本的机器肯定得同时开着代理程序,才能监听 127.0.0.1:8001 ,才能让你的脚本连接 127.0.0.1:8001 间接获取数据
ncepuzs
2022-02-26 12:15:38 +08:00
你爬虫程序运行在本地电脑的话,不开代理(“挂着梯子”),怎么给你返回数据?
还是说我对你的话理解有误?
imn1
2022-02-26 12:15:54 +08:00
如果你这个 proxies 是系统级代理,爬虫就不需要再写代理了
然后,你的梯子是固定 ip 的话,大站一般都有反爬,小心永久 ban 了你的梯子 ip ,得不偿失

你先试试用梯子爬一些没有墙的国外网站,看看什么情况
qtoq126
2022-02-26 14:06:55 +08:00
“反正你跑脚本的机器肯定得同时开着代理程序,才能监听 127.0.0.1:8001 ,才能让你的脚本连接 127.0.0.1:8001 间接获取数据”

@webshe11 那我应该如何实现一个自动爬虫程序,比如每天固定时间爬一次某个网站,然后把数据存到数据库中?这个自动爬虫程序中的代理应该如何写呢,或者说是我必须保证跑脚本的机器是开机状态而且连着代理才行吗?
webshe11
2022-02-26 15:27:37 +08:00
@qtoq126 跑脚本的机器当然要开机,而且只要在国内都要开着代理软件
gen900
2022-02-26 15:42:04 +08:00
有点懂楼主意思了,爬虫不是放出去就在网络世界里自己“爬”了。它本质上就是一个不停发网络请求的程序,这样说明白?
wangyu17455
2022-02-26 16:05:32 +08:00
假设你用的 java 写的爬虫,那么设置代理然后爬就是这样的
``` java
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ProxySelector;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Main {
public static void main(String[] args) throws IOException, InterruptedException {
var httpClient = HttpClient.newBuilder().proxy(ProxySelector.of(new InetSocketAddress("localhost", 8080))).build();
var requesrt = HttpRequest.newBuilder(URI.create("https://baidu.com")).build();
var response = httpClient.send(requesrt, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}
```
qtoq126
2022-02-26 16:09:36 +08:00
@webshe11 @gen900
谢谢回复,这样说我就理解了。就是说如果想实现一个自动爬虫程序,满足我上面的需求的话,可能需要租一台服务器(永不关机),然后在服务器上写一个定时程序才行吧
Soar360
2022-02-26 18:13:28 +08:00
btw ,墙内的网络如果要通过 HTTP 代理访问外网,是会被扫描到并断开链接的。
webshe11
2022-02-26 20:56:02 +08:00
@qtoq126 买台海外的 省了代理这一步了
rabbirbot00
2022-02-27 10:02:24 +08:00
有可能存在 DNS 污染的问题,把 socks5 改为 socks5h 试试,这样就会使用目标代理服务器的 DNS 了。
ShuoHui
2022-02-27 10:09:16 +08:00
“写成梯子的 IP 跟 prot”这里有问题吧,如果是梯子,得看代理协议吧?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/836531

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX