写脚本从指定网站抓取数据的时候,免不了会被网站屏蔽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添加到后续的请求中。

具体的代码如下:

import time
import json
import requests
from 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 = None def 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 re
def 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

抓取代理IP的更多相关文章

  1. python爬虫成长之路(二):抓取代理IP并多线程验证

    上回说到,突破反爬虫限制的方法之一就是多用几个代理IP,但前提是我们得拥有有效的代理IP,下面我们来介绍抓取代理IP并多线程快速验证其有效性的过程. 一.抓取代理IP 提供免费代理IP的网站还挺多的, ...

  2. Python 爬虫抓取代理IP,并检测联通性

    帮朋友抓了一些代理IP,并根据测试联的通性,放在了不通的文件夹下.特将源码分享 注意: 1,环境Python3.5 2,安装BeautifulSoup4  requests 代码如下: 1 2 3 4 ...

  3. python爬虫爬取代理IP

    # #author:wuhao # #--*------------*-- #-****#爬取代理IP并保存到Excel----#爬取当日的代理IP并保存到Excel,目标网站xicidaili.co ...

  4. 爬虫爬取代理IP池及代理IP的验证

    最近项目内容需要引入代理IP去爬取内容. 为了项目持续运行,需要不断构造.维护.验证代理IP. 为了绕过服务端对IP 和 频率的限制,为了阻止服务端获取真正的主机IP. 一.服务器如何获取客户端IP ...

  5. 自动爬取代理IP例子

    import time import json import datetime import threading import requests from lxml import etree from ...

  6. 使用Python爬取代理ip

    本文主要代码用于有代理网站http://www.kuaidaili.com/free/intr中的代理ip爬取,爬虫使用过程中需要输入含有代理ip的网页链接. 测试ip是否可以用 import tel ...

  7. python代理池的构建3——爬取代理ip

    上篇博客地址:python代理池的构建2--代理ip是否可用的处理和检查 一.基础爬虫模块(Base_spider.py) #-*-coding:utf-8-*- ''' 目标: 实现可以指定不同UR ...

  8. 爬取代理IP

    现在爬虫好难做啊,有些网站直接封IP,本人小白一个,还没钱,只能找免费的代理IP,于是去爬了西刺免费代理,结果技术值太低,程序还没调试好, IP又被封了... IP又被封了... IP又被封了... ...

  9. 爬取代理IP,并判断是否可用。

    # -*- coding:utf-8 -*- from gevent import monkey monkey.patch_all() import urllib2 from gevent.pool ...

随机推荐

  1. Java多线程16:线程组

    线程组 可以把线程归属到某一个线程组中,线程组中可以有线程对象,也可以有线程组,组中还可以有线程,这样的组织结构有点类似于树的形式,如图所示: 线程组的作用是:可以批量管理线程或线程组对象,有效地对线 ...

  2. dojo/query源码解析

    dojo/query模块是dojo为开发者提供的dom查询接口.该模块的输出对象是一个使用css选择符来查询dom元素并返回NodeList对象的函数.同时,dojo/query模块也是一个插件,开发 ...

  3. java提高篇(四)-----理解java的三大特性之多态

    面向对象编程有三大特性:封装.继承.多态. 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据.对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法. 继承 ...

  4. Unity3D骨骼动画的分解(CleanData.Ani详解)

    CleanData是什么 CleanData以前没有特定的名字,(在easydown这个开源项目中,作为一个GameObjParser模块存在).在某三国项目中,我们使用GameObjParser将N ...

  5. js模版引擎handlebars.js实用教程——由于if功力不足引出的Helper

    返回目录 <!DOCTYPE html> <html> <head> <META http-equiv=Content-Type content=" ...

  6. 虚拟化平台cloudstack(2)——安装(上)

    vmware workstation安装ubuntu server12.04 这个其实没什么说的了,下软件,安装,一顿下一步,OK. 安装完成后,为ubuntu server 12.04安装桌面. 使 ...

  7. JAVA环境配置-Eclipse新建项目

    首先配置安装jdk和jre 安装如下: 然后配置变量环境:右键我的电脑--属性--高级系统设置--环境变量--系统变量--找到PATH--编辑 将安装配置的jdk的目录和jdk目录下的bin目录放入其 ...

  8. Mysql 函数分类

    比较重要的 1 REVERSE(s)    将字符串s的顺序反过来 2 TRIM(s)          去掉字符串s开始和结尾处的空格 一.数学函数  数学函数主要用于处理数字,包括整型.浮点数等. ...

  9. 关于页面查询多数据查询问题(foreach)

    最近纠结的一个问题,就是页面综合查询总报错,之前用过传参用list传就没问题,但现在用map总是报错,缓释直接贴图吧,希望对遇到问题的朋友有帮助页面传来参数,之前是 这样写的,直接将拿来的数据封装成一 ...

  10. 180分钟的python学习之旅

    最近在很多地方都可以看到Python的身影,尤其在人工智能等科学领域,其丰富的科学计算等方面类库无比强大.很多身边的哥们也提到Python非常的简洁方便,比如用Django搭建一个见得网站只需要半天时 ...