写脚本从指定网站抓取数据的时候,免不了会被网站屏蔽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. 【推荐】【给中高级开发者】构建高性能ASP.NET应用的几点建议

    本篇目录 早期阶段就要对应用进行负载测试 使用高性能类库 你的应用是CPU密集还是IO密集的 使用基于Task的异步模型,但要慎重 分发缓存和会话(session)状态 创建Web Gardens 巧 ...

  2. 用UWP实现一个和win10设置页面类似的布局

    不知道有人注意过Win10中的设置页面的布局没?那个页面会根据不同的窗口宽度来调节显示的内容,甚至来后退按钮的操作在不同的宽度也是不同的,看图: 是不是有点cool呢,这篇文章,我们就来做一个类似的布 ...

  3. Java多线程2:Thread中的实例方法

    Thread类中的方法调用方式: 学习Thread类中的方法是学习多线程的第一步.在学习多线程之前特别提出一点,调用Thread中的方法的时候,在线程类中,有两种方式,一定要理解这两种方式的区别: 1 ...

  4. 赴美工作常识(Part 3 - 英语)

    在<Part 2 - 申请>的评论中有人问英语要达到何种水平,以及如何提高.其实英语也不是我的强项,只是刚刚好做到能够沟通而已.由于我在知乎上回到过一个类似问题,我就基于那个答案简单说一下 ...

  5. jQuery实现在线文档

    1.1.1 摘要 现在,许多网站都提供在线图片和图书阅读的功能,这种方式比下载后阅读来的直观和人性化,要实现该功能涉及到点击处理和图片动态加载. 在接下来的博文中,我们将通过Javascript方式实 ...

  6. Linux多线程系列-2-条件变量的使用(线程安全队列的实现)

    多线程情况下,往往需要使用互斥变量来实现线程间的同步,实现资源正确共享. linux下使用如下变量和函数 //条件变量 pthread_cond_t int pthread_cond_init (pt ...

  7. Android开发学习之路-下拉刷新以及GridView的使用

    GridView是类似于ListView的控件,只是GridView可以使用多个列来呈现内容,而ListView是以行为单位,所以用法上是差不多的. 主布局文件,因为要做下拉刷新,所以加了一个Prog ...

  8. 技术往事:改变世界的TCP/IP协议(珍贵多图、手机慎点)

    1.前言 作为应用层开发人员,接触最多的网络协议通常都是传输层的TCP(与之同处一层的另一个重要协议是UDP协议),但对于IP协议,对于应用程序员来说更多的印象还是IP地址这个东西,再往深一点也就很难 ...

  9. HTML5语义标签的实践

    <article> 定义一篇文章 论坛发帖 博客文章 一篇文章 <article>  <h1>标题</h1>  <p>内容</p> ...

  10. hibernate(五)核心开发接口与对象的三种状态

    本文链接:http://www.orlion.ml/37/ 一.Configuration 1.AnnotationConfiguration 2.进行配置信息的管理 3.configure()方法通 ...