博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
抓取代理IP
阅读量:6090 次
发布时间:2019-06-20

本文共 2457 字,大约阅读时间需要 8 分钟。

写脚本从指定网站抓取数据的时候,免不了会被网站屏蔽IP。所以呢,就需要有一些IP代理。随便在网上找了一个提供免费IP的网站做IP抓取。本次实践抓取的是其提供的国内匿名代理。可以打开网站查看一下源码,我们需要的内容在一个table区域内,通过BS4能很容易提取需要的信息。

Step 1:HTML页面获取

观察可以发现有我们需要的信息的页面url有下面的规律:www.xicidaili.com/nn/+页码。可是你如果直接通过get方法访问的话你会发现会出现500错误。原因其实出在这个规律下的url虽然都是get方法获得数据,但都有cookie认证。那么问题来了——怎么获得需要的cookie呢?

我们可以想一下,我们第一次通过浏览器访问该网站的主页是能打开的,其网站的各个子模块都可以打开。一定在某个时间段内我们的浏览器获得了该网站设置的cookie。清楚浏览器cookie,重新打开该网站首页,通过开发者工具可以发现我们打开首页的时候没有上传cookie,而是网站会下发cookie。接着打开我们上面找到的规律url页面,比对一下,发现我们上传的cookie就是在首页下发的cookie。这样就有办法了——编写脚本的时候,先访问一下首页获得cookie,再将获得的cookie添加到后续的请求中。

673170-20160503193909997-1962539975.png

具体的代码如下:

import timeimport jsonimport requestsfrom bs4 import BeautifulSoup_headers={            "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",            "Accept-Encoding":"gzip, deflate, sdch",            "Accept-Language":"zh-CN,zh;q=0.8",            "Cache-Control":"max-age=0",            "Host":"www.xicidaili.com",            "Referer":"http://www.xicidaili.com/nn/",            "Upgrade-Insecure-Requests":"1",            "User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36"            }_cookies = Nonedef spider(total_page):    url = "http://www.xicidaili.com/nn/"    for i in range(1,total_page):    if i % 100 == 0:               #100个页面更新一次Cookie        _cookies = requests.get("http://www.xicidaili.com/",headers=_headers).cookies    r = requests.get(url+str(i),headers = _headers,cookies = _cookies)    html_doc = r.text    #print html_doc    status_code = r.status_code    print i,status_code    r.close()            with open("%s.html"%i,"w") as f:  #保存html,也可以直接信息提取        f.write(html_doc.encode("utf-8"))    time.sleep(1)        _headers["Referer"]=url+str(i-1)if __name__ == "__main__":    _cookies = requests.get("http://www.xicidaili.com/",headers=_headers).cookies    spider(200)

Step2 : 信息提取

分析html结构,使用BS4进行信息提取。具体代码如下:

from bs4 import BeautifulSoup#import redef parese(html_doc):    ip_info = []    soup = BeautifulSoup(html_doc,"lxml")    for tag in soup.find_all(name = "table"):#,class_="odd"):#),attrs={"data-foo": "value"}):    for tr in tag.find_all("tr",class_=True)#class_=True <=> re.compile("odd|")        try:             tmp = tr.find_all("td",class_=None):             ip = tmp[0].string             port = tmp[1].string        except:            pass        ip_info.append(zip(ip,port))    return ip_info

转载于:https://www.cnblogs.com/taceywong/p/5456370.html

你可能感兴趣的文章
ssh 链接服务器出现 Write failed: Broken pipe
查看>>
Rails console 不能使用,出现cannot load such file -- readline (LoadError) 的解决
查看>>
uva 11468 Substring
查看>>
UVALive-3263 That Nice Euler Circuit (几何欧拉定理)
查看>>
Linux系统Mysql备份的导入导出
查看>>
大道至简第一章感想
查看>>
完美解决PHP中文乱码
查看>>
js获取下拉,单选
查看>>
Spring源码系列 — Envoriment组件
查看>>
zw量化交易·实盘操作·系列培训班
查看>>
repeater 设置分页
查看>>
Linux基础命令一
查看>>
CSRF笔记
查看>>
关于JS的return false
查看>>
HDU - 1789 Doing Homework again 贪心
查看>>
MySQL 忘记密码怎么办?
查看>>
Linux关闭端口
查看>>
ROS在Ubuntu下的安装
查看>>
UML类图关系全面剖析
查看>>
“问吧”调查问卷的分析总结与感受
查看>>