最近刚接触爬虫,想爬一些墙外的数据
有个疑问,目前我的代理是这样设置的
proxies = {
"https": "http://127.0.0.1:8001",
"http": "http://127.0.0.1:8001",
}
需要挂着梯子,才可以正常返回数据
但是我理解的是如果我设置一个定时爬虫程序,它应该是跟我的机器环境无关的啊,也就是说,无论我的机器是否是挂着梯子的,程序应该都可以通过增加代理参数正常的返回数据才对?
我尝试着把 proxies 参数设置成挂梯子后的 IP+IP 端口仍然无法正常获取数据
不知道是不是我的方法不对,还是理解有问题,望大佬指点一下,谢谢了
1
celeron533 2022-02-26 10:02:03 +08:00
如果你访问的目标不是 http ,而是 socket 之类的,试试看用 socks5 代理。http 代理有局限性。
|
2
qtoq126 OP |
3
opengps 2022-02-26 10:10:55 +08:00 via Android
你的机器的公网 ip 可能在对方服务器的黑名单之内
|
5
wangyu17455 2022-02-26 10:43:31 +08:00
@celeron533 http connect 可以实现 tcp over http
|
6
webshe11 2022-02-26 11:30:16 +08:00
> 但是我理解的是如果我设置一个定时爬虫程序,它应该是跟我的机器环境无关的啊,也就是说,无论我的机器是否是挂着梯子的,程序应该都可以通过增加代理参数正常的返回数据才对?
> 我尝试着把 proxies 参数设置成挂梯子后的 IP+IP 端口仍然无法正常获取数据 什么意思?没看太明白 反正你跑脚本的机器肯定得同时开着代理程序,才能监听 127.0.0.1:8001 ,才能让你的脚本连接 127.0.0.1:8001 间接获取数据 |
7
ncepuzs 2022-02-26 12:15:38 +08:00
你爬虫程序运行在本地电脑的话,不开代理(“挂着梯子”),怎么给你返回数据?
还是说我对你的话理解有误? |
8
imn1 2022-02-26 12:15:54 +08:00
如果你这个 proxies 是系统级代理,爬虫就不需要再写代理了
然后,你的梯子是固定 ip 的话,大站一般都有反爬,小心永久 ban 了你的梯子 ip ,得不偿失 你先试试用梯子爬一些没有墙的国外网站,看看什么情况 |
9
qtoq126 OP “反正你跑脚本的机器肯定得同时开着代理程序,才能监听 127.0.0.1:8001 ,才能让你的脚本连接 127.0.0.1:8001 间接获取数据”
@webshe11 那我应该如何实现一个自动爬虫程序,比如每天固定时间爬一次某个网站,然后把数据存到数据库中?这个自动爬虫程序中的代理应该如何写呢,或者说是我必须保证跑脚本的机器是开机状态而且连着代理才行吗? |
11
gen900 2022-02-26 15:42:04 +08:00 via iPhone
有点懂楼主意思了,爬虫不是放出去就在网络世界里自己“爬”了。它本质上就是一个不停发网络请求的程序,这样说明白?
|
12
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()); } } ``` |
13
qtoq126 OP |
14
Soar360 2022-02-26 18:13:28 +08:00
btw ,墙内的网络如果要通过 HTTP 代理访问外网,是会被扫描到并断开链接的。
|
16
rabbirbot00 2022-02-27 10:02:24 +08:00 via Android
有可能存在 DNS 污染的问题,把 socks5 改为 socks5h 试试,这样就会使用目标代理服务器的 DNS 了。
|
17
ShuoHui 2022-02-27 10:09:16 +08:00 via iPhone
“写成梯子的 IP 跟 prot”这里有问题吧,如果是梯子,得看代理协议吧?
|