当前位置: 首页 > news >正文

抓取代理IP

写脚本从指定网站抓取数据的时候,免不了会被网站屏蔽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 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

相关文章:

  • Jquery Ajax时 error处理 之 parsererror
  • 0816
  • 面试逻辑题
  • 10个网页设计师必备的CSS技巧(转)
  • 使用py2exe发布windows平台Python
  • 线程安全的队列
  • 用string存取二进制数据
  • struct{0}二
  • fastText、TextCNN、TextRNN……这里有一套NLP文本分类深度学习方法库供你选择
  • DNGuard V1.0 for Win98, WinMe 的运行库发布
  • [Quest ActiveRoles Management Shell for Active Directory] QADProxyAddress命令相关的bug。
  • cursor:hand 与 cursor:pointer 的区别
  • win7中USB音箱没有声音解决的方法
  • 绘制思维导图的注意事项有哪些?
  • Sql去重语句
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • angular2 简述
  • Javascript Math对象和Date对象常用方法详解
  • JavaScript类型识别
  • JDK 6和JDK 7中的substring()方法
  • MySQL几个简单SQL的优化
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • ReactNative开发常用的三方模块
  • text-decoration与color属性
  • 对象引论
  • 飞驰在Mesos的涡轮引擎上
  • 后端_ThinkPHP5
  • 开源地图数据可视化库——mapnik
  • 浏览器缓存机制分析
  • 你真的知道 == 和 equals 的区别吗?
  • 再次简单明了总结flex布局,一看就懂...
  • 转载:[译] 内容加速黑科技趣谈
  • 仓管云——企业云erp功能有哪些?
  • 从如何停掉 Promise 链说起
  • ​2020 年大前端技术趋势解读
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • %@ page import=%的用法
  • (145)光线追踪距离场柔和阴影
  • (70min)字节暑假实习二面(已挂)
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (C语言)字符分类函数
  • (Note)C++中的继承方式
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (循环依赖问题)学习spring的第九天
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .gitignore文件_Git:.gitignore
  • .gitignore文件设置了忽略但不生效
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .NET Core引入性能分析引导优化
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
  • .net 受管制代码
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)
  • .NET企业级应用架构设计系列之应用服务器