A-A+

python爬虫:自动投票代码(自动爬取代理IP)

2016年07月25日 Python 暂无评论 阅读 10,113 views 次

此投票的爬虫代码中主要使用到requests、 bs4.BeautifulSoup、threading模块

因为某件事,朋友们在网络上搞起投票行为,为了帮朋友们,特意用python写下了这个投票代码的爬虫

投票网站的某政府单位的网站,所以网站程序和代码大家应该懂的

网站投票没有对IP进行限制,也就是说,只要每刷新一次地址,就可以投票一次,但为了防止一个IP出现过多投票记录,所以在代码中,增加了代理IP的多个user-agent。

 

获取该网站的投票接口,用浏览器F12,就可以找到了

浏览器获取投票接口

浏览器获取投票接口

 

代码如下:

  1. #!/usr/bin/env python
  2. # coding=utf-8
  3. # 戴儒锋
  4. # http://www.linuxyw.com
  5. import re
  6. import random
  7. import sys
  8. import time
  9. import datetime
  10. import threading
  11. from random import choice
  12. import requests
  13. import bs4
  14. def get_ip():
  15.     """获取代理IP"""
  16.     url = "http://www.xicidaili.com/nn"
  17.     headers = { "Accept":"text/html,application/xhtml+xml,application/xml;",
  18.                 "Accept-Encoding":"gzip, deflate, sdch",
  19.                 "Accept-Language":"zh-CN,zh;q=0.8,en;q=0.6",
  20.                 "Referer":"http://www.xicidaili.com",
  21.                 "User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36"
  22.                 }
  23.     r = requests.get(url,headers=headers)
  24.     soup = bs4.BeautifulSoup(r.text, 'html.parser')
  25.     data = soup.table.find_all("td")
  26.     ip_compile= re.compile(r'<td>(\d+\.\d+\.\d+\.\d+)</td>')    # 匹配IP
  27.     port_compile = re.compile(r'<td>(\d+)</td>')                # 匹配端口
  28.     ip = re.findall(ip_compile,str(data))       # 获取所有IP
  29.     port = re.findall(port_compile,str(data))   # 获取所有端口
  30.     return [":".join(i) for i in zip(ip,port)]  # 组合IP+端口,如:115.112.88.23:8080
  31. # 设置 user-agent列表,每次请求时,可在此列表中随机挑选一个user-agnet
  32. uas = [
  33.     "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:17.0; Baiduspider-ads) Gecko/17.0 Firefox/17.0",
  34.     "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9b4) Gecko/2008030317 Firefox/3.0b4",
  35.     "Mozilla/5.0 (Windows; U; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; BIDUBrowser 7.6)",
  36.     "Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko",
  37.     "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0",
  38.     "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.99 Safari/537.36",
  39.     "Mozilla/5.0 (Windows NT 6.3; Win64; x64; Trident/7.0; Touch; LCJB; rv:11.0) like Gecko",
  40.     ]
  41. def get_url(code=0,ips=[]):
  42.     """
  43.         投票
  44.         如果因为代理IP不可用造成投票失败,则会自动换一个代理IP后继续投
  45.     """
  46.     try:
  47.         ip = choice(ips)
  48.     except:
  49.         return False
  50.     else:
  51.         proxies = {
  52.             "http":ip,
  53.         }
  54.         headers2 = { "Accept":"text/html,application/xhtml+xml,application/xml;",
  55.                         "Accept-Encoding":"gzip, deflate, sdch",
  56.                         "Accept-Language":"zh-CN,zh;q=0.8,en;q=0.6",
  57.                         "Referer":"",
  58.                         "User-Agent":choice(uas),
  59.                         }
  60.     try:
  61.         num = random.uniform(0,1)
  62.         hz_url = "http://www.xxxxx.com/xxxx%s" % num   # 某投票网站的地址,这里不用真实的域名
  63.         hz_r = requests.get(hz_url,headers=headers2,proxies=proxies)
  64.     except requests.exceptions.ConnectionError:
  65.         print "ConnectionError"
  66.         if not ips:
  67.             print "not ip"
  68.             sys.exit()
  69.         # 删除不可用的代理IP
  70.         if ip in ips:
  71.             ips.remove(ip)
  72.         # 重新请求URL
  73.         get_url(code,ips)
  74.     else:
  75.         date = datetime.datetime.now().strftime('%H:%M:%S')
  76.         print u"第%s次 [%s] [%s]:投票%s (剩余可用代理IP数:%s)" % (code,date,ip,hz_r.text,len(ips))
  77. ips = []
  78. for i in xrange(6000):
  79.     # 每隔1000次重新获取一次最新的代理IP,每次可获取最新的100个代理IP
  80.     if i % 1000 == 0:
  81.         ips.extend(get_ip())
  82.     # 启用线程,隔1秒产生一个线程,可控制时间加快投票速度 ,time.sleep的最小单位是毫秒
  83.     t1 = threading.Thread(target=get_url,args=(i,ips))
  84.     t1.start()
  85.     time.sleep(1)

 

投票效果:

tuopiao

 

关键词:

给我留言

Copyright © linux系统运维 保留所有权利.   Theme  Ality 粤ICP备13023035号-1

用户登录

分享到: