1个VPS,有2个IP,Python用Requests抓取网页,如何使用第二个IP?

2012-11-20 08:46:19 +08:00
 liuxurong
xxx.xxx.xxx.xx1
xxx.xxx.xxx.xx2

.xx1是默认那个,如何在python内用第二个IP?
8323 次点击
所在节点    Python
19 条回复
manoon
2012-11-20 10:28:30 +08:00
socket proxy
mudone
2012-11-20 17:52:52 +08:00
cURL可以指定ip发起请求。
CoX
2012-11-20 18:11:57 +08:00
以前做过个小应用,用的是httplib2,稍作了下修改就能bind ip 了,不知道requests能不能直接bind ip
Livid
2012-11-20 18:15:16 +08:00
import requests

headers = {}
headers['Host'] = 'www.example.com'
requests.get('http://10.0.0.1/', headers=headers)
BigZ
2012-11-20 18:35:01 +08:00
@Livid 你没有看懂lz意思,

lz,你只能修改路由表,让系统使用指定IP作为源址,用ip route 来改
简单的做法是,你先在本机取消一个ip的绑定,只留你想要的那个
或者你起一个nginx做代理,配置文件里面listen两个不同的ip,python使用这个代理去采集,反正都是本机,性能损失不大
liuxurong
2012-11-20 18:39:50 +08:00
谢谢楼上各位
看来要用 @BigZ 的方法
bhuztez
2012-11-20 18:44:44 +08:00
SO_BINDTODEVICE 泪流满面啊
CoX
2012-11-20 19:00:03 +08:00
@liuxurong 虽然性能损失不大,但是为此做个nginx代理真必要

httplib2改个三五行代码,直接就能实现你的要求
liuxurong
2012-11-20 19:50:00 +08:00
@CoX 可否给个示例代码?
zbgzao
2012-11-20 19:57:48 +08:00
当然random_ip务必要改为外网IP
http://gist.github.com/4117504
zbgzao
2012-11-20 20:00:42 +08:00
感觉v2ex积分策略有点不靠谱, 我们算是绞尽脑汁给楼主想解决方案, 居然还要扣点, 而楼主可是一箭双雕 @Livid
kuaizi
2012-11-20 20:10:35 +08:00
一句命令修改VPS出口ip
http://actgod.com/archives/33/
这个?
CoX
2012-11-20 20:30:47 +08:00
@liuxurong 和10L代码类似,就是加上 socket.bind((source_ip,0)) 即可
ledzep2
2012-11-20 20:32:39 +08:00
bind正解
liuxurong
2012-11-21 00:58:18 +08:00
@zbgzao 代码可用,谢谢你们!采用这个方案了 我愿意给积分都给你 哈哈 :)
@CoX
humiaozuzu
2012-11-21 01:48:55 +08:00
@Livid @zbgzao 你的绞尽脑汁就是copy的很辛苦吗? http://stackoverflow.com/a/1150408/492864

@liuxurong google: python set source ip 就有很多答案了
yaotian
2012-12-05 08:12:49 +08:00
@zbgzao 这个random ip要在线吗?还是说任意的ip地址?
BOYPT
2012-12-05 10:56:16 +08:00
@zbgzao 充分说明v2ex是一个鼓励吐槽的社区。
neildd
2012-12-05 11:08:40 +08:00
--- /usr/lib64/python2.4/httplib.py 2009-09-04 03:38:18.000000000 +0800
+++ /usr/lib64/python2.4/httplib.py 2010-07-06 18:07:18.000000000 +0800
@@ -156,6 +156,7 @@
# maximal amount of data to read at one time in _safe_read
MAXAMOUNT = 1048576

+Local_BindIP = None
class HTTPMessage(mimetools.Message):

def addheader(self, key, value):
@@ -621,6 +622,8 @@
af, socktype, proto, canonname, sa = res
try:
self.sock = socket.socket(af, socktype, proto)
+ if Local_BindIP is not None:
+ self.sock.bind((Local_BindIP,0))
if self.debuglevel > 0:
print "connect: (%s, %s)" % (self.host, self.port)
self.sock.connect(sa)

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

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

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

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

© 2021 V2EX