Python四线程爬取西刺代理
import requests
from bs4 import BeautifulSoup
import lxml
import telnetlib #验证代理的可用性
import pymysql.cursors
import random
import threading BASEURL = 'http://www.xicidaili.com/' #西刺首页
urls = [BASEURL+ 'nn/',BASEURL+'nt/',BASEURL+'wn/',BASEURL+'wt/']#西刺分组(more)的ip信息链接列表 #请求头信息,必须有User-Agent
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'} #proxies = {'https': 'http://123.57.85.224:80', 'http': 'http://123.57.85.224:80'} #获得与数据库的连接和游标
def get_cc():
# 连接MySQL数据库
connection = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='root', db='iptables',
charset='utf8', cursorclass=pymysql.cursors.DictCursor)
# 通过cursor创建游标
cursor = connection.cursor()
return connection,cursor #保存ip_port到数据库
def save_ip_port(ip_port):
connection,cursor = get_cc()
try:
sql = 'insert into iptable(ip_port) values("'+ip_port+'")'
cursor.execute(sql)
except:
print('保存'+ip_port+'失败!!!!!')
else:
connection.commit()
connection.close() #从数据库获得ip_port
def get_ip_port():
connection,cursor = get_cc()
sql_get_id = 'select id,ip_port from iptable'
cursor.execute(sql_get_id)
#fetchone()是查询一条数据
id_list = cursor.fetchall()#得到所有的id的字典列表
i = random.randint(0,len(id_list)-1)
id_num = id_list[i]['id']
ip_port = id_list[i]['ip_port'] #获得所有可用的代理 return id_num,ip_port#返回id和ip_port:192.168.1.2:8080 #删除被封的ip_port
def del_ip_port(id_num):
connection,cursor = get_cc()
try:
sql = 'delete from iptable where id = ' + str(id_num)
cursor.execute(sql)
except:
print('删除'+ip_port+'失败!!!!!')
else:
connection.commit()
connection.close() #获得代理
def get_proxies(ip_port):#ip_port = '192.168.2.45:8088'
proxy_ip = 'http://' + ip_port
proxy_ips = 'https://' + ip_port
proxies = {'https': proxy_ips, 'http': proxy_ip}
return proxies #获得对应url分类的最大页码
def get_max_pagenum(url): #url是more(分类)的链接,/nn,/nt.... response = requests.get(url,headers = headers)
status_code = response.status_code
soup = BeautifulSoup(response.content,'lxml')
max_pagenum = soup.find('div',attrs = {'class':'pagination'}).find_all('a')[-2].string
max_pagenum = int(max_pagenum)
return max_pagenum #验证代理是否有用,ip_port = '192.168.2.45:8088'
#每得到一个ip_port都要进行验证,如果可用则保存,否则抛弃
def verifyProxyList(ip_port):
url = 'http://www.baidu.com'
# proxies = { "http": "http://"+ ip_port }
host ,port = ip_port.split(':')
try:
# res = requests.get(url,headers = headers,proxies = proxies,timeout = 5.0)
telnetlib.Telnet(host, port=port, timeout=5)
except:
print('---Failur:' + ip_port)
else:
#ips.append(ip_port)#这里应该存储到Redis等数据库中
save_ip_port(ip_port) def main(url,proxies):#这里是more的链接,/nn/1,/nn/2.... try:
response = requests.get(url,headers = headers,proxies = proxies,timeout = 5.0)
status_code = response.status_code #503说明ip被封 if(status_code != requests.codes.ok):#响应的不是正常状态
#删除旧的代理ip_port,这里还需要验证是否有bug
old_ip_port = proxies['http'][7:]
del_ip_port(old_ip_port)
#修改代理,重新请求
id_num,ip_port = get_ip_port()
proxies = get_proxies(ip_port)
print(str(proxies))
return soup = BeautifulSoup(response.content,'lxml') results = soup.find_all('tr')#遍历所有的tr for result in results[1:]:#这里第一个tr子标签是th,所以会报错
tdlist = result.find_all('td')
ip_port = tdlist[1].string+':'+tdlist[2].string
verifyProxyList(ip_port)
except:
print('请求异常......') class myThread(threading.Thread):
def __init__(self, threadID, name, url):
threading.Thread.__init__(self)
self.threadID = threadID
self.name = name
self.url = url def run(self):
print('正在执行线程:'+self.name)#没有验证这一行的可行性
id_num,ip_port = get_ip_port()
proxies = get_proxies(ip_port)
max_pagenum = get_max_pagenum(self.url)
#print(max_pagenum)
for i in range(1,max_pagenum):
url = self.url + '/' + str(i)
main(url,proxies) #4线程爬取西刺的ip代理池
if __name__ == '__main__': t1 = myThread(1,"Thread-1",urls[0])
t2 = myThread(2,"Thread-2",urls[1])
t3 = myThread(3,"Thread-3",urls[2])
t4 = myThread(4,"Thread-4",urls[3])
t1.start()
t2.start()
t3.start()
t4.start()
t1.join()
t2.join()
t3.join()
t4.join()
Python四线程爬取西刺代理的更多相关文章
- 使用XPath爬取西刺代理
因为在Scrapy的使用过程中,提取页面信息使用XPath比较方便,遂成此文. 在b站上看了介绍XPath的:https://www.bilibili.com/video/av30320885?fro ...
- 手把手教你使用Python爬取西刺代理数据(下篇)
/1 前言/ 前几天小编发布了手把手教你使用Python爬取西次代理数据(上篇),木有赶上车的小伙伴,可以戳进去看看.今天小编带大家进行网页结构的分析以及网页数据的提取,具体步骤如下. /2 首页分析 ...
- Scrapy爬取西刺代理ip流程
西刺代理爬虫 1. 新建项目和爬虫 scrapy startproject daili_ips ...... cd daili_ips/ #爬虫名称和domains scrapy genspider ...
- 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 ...
- python3爬虫-通过requests爬取西刺代理
import requests from fake_useragent import UserAgent from lxml import etree from urllib.parse import ...
- 爬取西刺ip代理池
好久没更新博客啦~,今天来更新一篇利用爬虫爬取西刺的代理池的小代码 先说下需求,我们都是用python写一段小代码去爬取自己所需要的信息,这是可取的,但是,有一些网站呢,对我们的网络爬虫做了一些限制, ...
- 爬取西刺网的免费IP
在写爬虫时,经常需要切换IP,所以很有必要自已在数据维护库中维护一个IP池,这样,就可以在需用的时候随机切换IP,我的方法是爬取西刺网的免费IP,存入数据库中,然后在scrapy 工程中加入tools ...
- scrapy爬取西刺网站ip
# scrapy爬取西刺网站ip # -*- coding: utf-8 -*- import scrapy from xici.items import XiciItem class Xicispi ...
随机推荐
- idea当配置eclipse快捷键时,全局替换的快捷键是什么?
简介 每次为了新版本新建一个分支的时候,都要改每个maven的版本号,好麻烦,有么有?如下图: 当idea配置eclipse快捷键时,默认是没有全局替换快捷键的,需要设置 步骤 首先打开setti ...
- 【资料下载区】【GK101固件】更新日期2017/1/11
<GK101任意波发生器>升级固件发布(版本:1.0.2build539)<GK101任意波发生器>升级固件发布(版本:1.0.2build851)<GK101任意波发生 ...
- dma子系统 dmac
DMA子是CPU中实现数据传输的一种方式,CPU配置好DMA控制器之后发起数据传输,CPU本身不参与数据传输的动作中去. DMA种类: 分为外设DMA和DMA控制器.其中外设DMA实现的为特定的外设与 ...
- 【OSPF】防环机制详解
我们在提到OSPF的时候,时常喜欢说的一句话就是,OSPF能够计算出无环的路由,那么OSPF究竟是如何规避路由环路的呢?OSPF与距离矢量路由协议不同,运行OSPF的路由器之间交互并不是路由信息,而是 ...
- 基于【CentOS-7+ Ambari 2.7.0 + HDP 3.0】搭建HAWQ数据仓库——操作系统配置,安装必备软件
注意未经说明,所有本文中所有操作都默认需要作为root用户进行操作. 一.安装zmodem,用于远程上传下载文件,安装gedit,方便重定向到远程windows上编辑文件(通过xlanuch) [ro ...
- JS字符串常用方法总结
1.toLowerCase(): 把字符串转为小写,返回新的字符串. var str="Hello World"; var str1=str.toLowerCase(); cons ...
- php冒泡排序详解笔记
冒泡 /* * 冒泡排序(从小到大) * 介绍: * 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来. * 思路: * 比较相邻的元素.如果第一个比第二个大,就交换他 ...
- 一、K3 WISE 开发插件《K3 WISE常用数据表整理》
在后台数据库ICClassType表中,字段FID<0的是老单,FID>0的是新单. ----------------系统设置------------------------FStatus ...
- Cookiecutter: 更好的项目模板工具:(3)高级用法
本文中的Hook就是钩子,钩子就是Hook 使用生成前/生成后钩子脚本 你可以在项目生成之前和/或之后运行Python或Shell脚本. 像这样把它们放进Hook里: cookiecutter-som ...
- HTML5 移动端的上下左右滑动问题
在移动端页面上,如果要实现[顶部轮播,手指触摸左右滑动]我的方案是,通过监听滑动,阻止默认事件来完成 div.addEventListener('touchmove',function(event){ ...