爬取西刺网代理ip,并把其存放mysql数据库
需求:
获取西刺网代理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数据库的更多相关文章
- 爬取西刺网的免费IP
在写爬虫时,经常需要切换IP,所以很有必要自已在数据维护库中维护一个IP池,这样,就可以在需用的时候随机切换IP,我的方法是爬取西刺网的免费IP,存入数据库中,然后在scrapy 工程中加入tools ...
- 爬取西刺ip代理池
好久没更新博客啦~,今天来更新一篇利用爬虫爬取西刺的代理池的小代码 先说下需求,我们都是用python写一段小代码去爬取自己所需要的信息,这是可取的,但是,有一些网站呢,对我们的网络爬虫做了一些限制, ...
- Python四线程爬取西刺代理
import requests from bs4 import BeautifulSoup import lxml import telnetlib #验证代理的可用性 import pymysql. ...
- 使用XPath爬取西刺代理
因为在Scrapy的使用过程中,提取页面信息使用XPath比较方便,遂成此文. 在b站上看了介绍XPath的:https://www.bilibili.com/video/av30320885?fro ...
- scrapy爬取西刺网站ip
# scrapy爬取西刺网站ip # -*- coding: utf-8 -*- import scrapy from xici.items import XiciItem class Xicispi ...
- 手把手教你使用Python爬取西刺代理数据(下篇)
/1 前言/ 前几天小编发布了手把手教你使用Python爬取西次代理数据(上篇),木有赶上车的小伙伴,可以戳进去看看.今天小编带大家进行网页结构的分析以及网页数据的提取,具体步骤如下. /2 首页分析 ...
- python scrapy 爬取西刺代理ip(一基础篇)(ubuntu环境下) -赖大大
第一步:环境搭建 1.python2 或 python3 2.用pip安装下载scrapy框架 具体就自行百度了,主要内容不是在这. 第二步:创建scrapy(简单介绍) 1.Creating a p ...
- python+scrapy 爬取西刺代理ip(一)
转自:https://www.cnblogs.com/lyc642983907/p/10739577.html 第一步:环境搭建 1.python2 或 python3 2.用pip安装下载scrap ...
- Scrapy爬取西刺代理ip流程
西刺代理爬虫 1. 新建项目和爬虫 scrapy startproject daili_ips ...... cd daili_ips/ #爬虫名称和domains scrapy genspider ...
随机推荐
- Python 字典中一键对应多个值
#字典的一键多值 print'方案一 list作为dict的值 值允许重复' d1={} key=1 value=2 d1.setdefault(key,[]).append(value) value ...
- 设计一个有getMin功能的栈(2)
题目: 实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作. 要求: 1.pop.push.getMin操作的时间复杂度都是O(1) 2.设计的栈类型可以输用现成的栈结构 解答 ...
- 【sunday算法】玄学字符串匹配
和KMP相似,用于字符串的匹配,貌似平均复杂度比KMP快,也比KMP更好理解. 大概意思是: 如果串b被串a包含,那么串a此时与串b匹配的部分一定一样 所以如果从开头开始匹配到不同处时,在a串找中此时 ...
- 【链表】BZOJ1588: [HNOI2002]营业额统计
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 17555 Solved: 7179[Submit][Sta ...
- 【转载】LINUX上MYSQL优化三板斧
现在MySQL运行的大部分环境都是在Linux上的,如何在Linux操作系统上根据MySQL进行优化,我们这里给出一些通用简单的策略.这些方法都有助于改进MySQL的性能. 闲话少说,进入正题. 一. ...
- 使用筛选器特性标记方法解决webapi 跨域问题
在我的之前随笔 解决api.WebService跨域问题 中有人问到可以用特性来解决跨域问题吗,答案是肯定的,可以的:操作如下: 首先建一个类CrossSiteAttribute:从抽象 Action ...
- Ubuntu系统下将默认的python2.7升级到3.5
在ubuntu 的终端中用代码下载最新的Python sudo apt-get install python3 系统会提示输入Linux 的密码,输入密码后下载 刚才下载的Python程序被安装在us ...
- Python中function(函数)和methon(方法)的区别
在Python中,对这两个东西有明确的规定: 函数function —— A series of statements which returns some value to a caller. It ...
- 发布到ASP.NET CORE项目到 Windows server 2012
原文: https://github.com/zeusro/MarkdownBlog/blob/master/2018/2018-01-17-01.md 发布到ASP.NET CORE项目到 Wind ...
- MYSQL的REPLACE和ON DUPLICATE KEY UPDATE使用
REPLACE 我们在使用数据库时可能会经常遇到这种情况.如果一个表在一个字段上建立了唯一索引,当我们再向这个表中使用已经存在的键值插入一条记录,那将会抛出一个主键冲突的错误.当然,我们可能想用新记录 ...