需求:

  获取西刺网代理ip信息,包括ip地址、端口号、ip类型

  西刺网:http://www.xicidaili.com/nn/

那,如何解决这个问题?

  分析页面结构和url设计得知:

    数据都在本页面可以全部获取,没有单独的详情页面

    下一页通过更改当前页面最后url后缀进行跳转页面,那我实现URL的拼接不就解决这个问题了

那,软件的运行环境?

    python3.5

    scrapy

    twisted

    request

    pymysql

  以上是第三方包,通过pip安装

  MySQL服务

其中db,user,password的值根据实际情况而定

#!/usr/bin/python3

__author__ = 'beimenchuixue'
__blog__ = 'http://www.cnblogs.com/2bjiujiu/' import requests
import pymysql
from time import sleep
from random import randint, choice
from scrapy.selector import Selector
from twisted.enterprise import adbapi
from twisted.internet import reactor # 数据库基本配置, 自行配置
db_settings = {
'host': 'localhost',
'db': 'db_name',
'user': 'user_name',
'password': 'password',
'charset': 'utf8',
'use_unicode': True
}
# conn = pymysql.connect(**db_settings)
# cursor = conn.cursor() # 生成连接池
db_conn = adbapi.ConnectionPool('pymysql', **db_settings) def go_sleep():
"""进行随机io堵塞,模仿人访问"""
while randint(0, 1):
sleep(choice([0.1, 0.2, 0.3, 0.4, 0.5, 0.6])) def get_sql(ip, port, ip_type):
"""获得sql语句"""
if ip and port and ip_type:
sql = """insert into
ip_server(ip, port, ip_type)
value (%s, %s, %s)
on DUPLICATE key update ip=values(ip), port=values(port), ip_type=values(ip_type)"""
try:
params = (ip, int(port), ip_type)
except Exception as e:
print(e)
return None
return sql, params
else:
return None def go_insert(cursor, sql, params):
"""数据库插入操作"""
try:
cursor.execute(sql, params)
except Exception as e:
print(e) def get_ip():
"""爬取ip信息并存入数据库"""
# 设置请求头
headers = {
'Referer': 'http://www.xicidaili.com/nn/',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36'
}
# 获取50页的数据
for page in range(1, 50):
# 建立关系映射,增加程序可阅读性
ip_index, port_index, type_index = 2, 3, 6
# 爬取的url
url = 'http://www.xicidaili.com/nn/{page}'.format(page=page) go_sleep() response = requests.get(url, headers=headers)
# 打印状态码
print(response.status_code)
# 进行页面解析
selectors = Selector(text=response.text)
all_trs = selectors.css('#ip_list .odd')
for tr in all_trs:
ip = tr.css('td:nth-child(%s)::text' % ip_index).extract_first()
port = tr.css('td:nth-child(%s)::text' % port_index).extract_first()
ip_type = tr.css('td:nth-child(%s)::text' % type_index).extract_first()
sql, params = get_sql(ip, port, ip_type)
if sql:
try:
# cursor.execute(sql, params)
# conn.commit()
# 执行sql操作
db_conn.runInteraction(go_insert, sql, params) except Exception as e:
print(e)
else:
break if __name__ == '__main__':
get_ip()
# 让twisted的sql操作去完成
reactor.callLater(4, reactor.stop)
reactor.run()

  

爬取西刺网代理ip,并把其存放mysql数据库的更多相关文章

  1. 爬取西刺网的免费IP

    在写爬虫时,经常需要切换IP,所以很有必要自已在数据维护库中维护一个IP池,这样,就可以在需用的时候随机切换IP,我的方法是爬取西刺网的免费IP,存入数据库中,然后在scrapy 工程中加入tools ...

  2. 爬取西刺ip代理池

    好久没更新博客啦~,今天来更新一篇利用爬虫爬取西刺的代理池的小代码 先说下需求,我们都是用python写一段小代码去爬取自己所需要的信息,这是可取的,但是,有一些网站呢,对我们的网络爬虫做了一些限制, ...

  3. Python四线程爬取西刺代理

    import requests from bs4 import BeautifulSoup import lxml import telnetlib #验证代理的可用性 import pymysql. ...

  4. 使用XPath爬取西刺代理

    因为在Scrapy的使用过程中,提取页面信息使用XPath比较方便,遂成此文. 在b站上看了介绍XPath的:https://www.bilibili.com/video/av30320885?fro ...

  5. scrapy爬取西刺网站ip

    # scrapy爬取西刺网站ip # -*- coding: utf-8 -*- import scrapy from xici.items import XiciItem class Xicispi ...

  6. 手把手教你使用Python爬取西刺代理数据(下篇)

    /1 前言/ 前几天小编发布了手把手教你使用Python爬取西次代理数据(上篇),木有赶上车的小伙伴,可以戳进去看看.今天小编带大家进行网页结构的分析以及网页数据的提取,具体步骤如下. /2 首页分析 ...

  7. python scrapy 爬取西刺代理ip(一基础篇)(ubuntu环境下) -赖大大

    第一步:环境搭建 1.python2 或 python3 2.用pip安装下载scrapy框架 具体就自行百度了,主要内容不是在这. 第二步:创建scrapy(简单介绍) 1.Creating a p ...

  8. python+scrapy 爬取西刺代理ip(一)

    转自:https://www.cnblogs.com/lyc642983907/p/10739577.html 第一步:环境搭建 1.python2 或 python3 2.用pip安装下载scrap ...

  9. Scrapy爬取西刺代理ip流程

    西刺代理爬虫 1. 新建项目和爬虫 scrapy startproject daili_ips ...... cd daili_ips/ #爬虫名称和domains scrapy genspider ...

随机推荐

  1. ajax介绍及使用

    一.什么是ajax:(只刷新局部页面的技术) AJAX全称为“Asynchronous JavaScript and XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发 ...

  2. 浅谈Vue模板的那些事儿

    接触过vue的童鞋都知道,组件的模板一般都是在template选项内定义的,如 Vue.component('child-component', { template: '<h3>我是闰土 ...

  3. 对RC4算法进行改写,新的加密算法RCX。

    最近研究JWT算法, JWT由header.payload.signature三个部分组成,payload是非加密的,一些敏感信息能被别人非法获得,必要时候要加密. 加密算法中,RC4算法的速度可以达 ...

  4. 地址总线、数据总线、寻址能力、字长及cpu位数等概念之间的关系

    地址总线决定了CPU的寻址能力:数据总线的宽度与字长及CPU位数一致. 详细解释见下文: 1.地址总线与寻址能力 要存取数据或指令就要知道数据或指令存放的位置,地址寄存器存储的就是CPU当前要存取的数 ...

  5. ajax写登录页面

    静态配置 STATICFILES_DIRS = ( os.path.join(BASE_DIR,'my_blog','static'), ) AUTH_USER_MODEL = "app01 ...

  6. Java的参数传递是值传递还是引用传递

    当一个对象被当作参数传递到一个方法后,在此方法内可以改变这个对象的属性,那么这里到底是值传递还是引用传递?  答:是值传递.Java 语言的参数传递只有值传递.当一个对象实例作为一个参数被传递到方法中 ...

  7. instr函数的"重载"

    .带两个参数的 --模糊查询,comp表的Mobel和show_name字段中含有'张' INSTR(COMP.MOBILE .带三个参数的 ) from dual; 结果: 第三个参数:从字符串&q ...

  8. 10、ABPZero系列教程之拼多多卖家工具 拼团提醒逻辑功能实现

    上篇文章已经封装好了类库,现在继续实现功能,在ABPZero框架的基础上来实现一个完整的功能. Redis缓存 编写功能前先在本机安装好Redis,需要用到Redis做缓存,以下分享2个Windows ...

  9. Linux各种版本

     1.1   Fedora Core和Fedora 一开始总搞不清楚 Fedora Core和Fedora有什么关系?有什么不同,现在终于明白了,自从Fedora Core 第七版开始以后就开始称作F ...

  10. 51Nod 1182 完美字符串(字符串处理 贪心 Facebook Hacker Cup选拔)

    1182 完美字符串             题目来源:                         Facebook Hacker Cup选拔         基准时间限制:1 秒 空间限制:1 ...