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

2016 年 7 月 25 日12:05:54 1 17,295 views
摘要

此投票的爬虫代码中主要使用到requests、 bs4.BeautifulSoup、threading模块。代码主要分为二个功能:采集代理IP和投票。脚本每隔一段时间就会自动更新代理IP,然后再投票的时候,在这些IP中,随机挑选一个使用,如果这个IP不能使用时,则删除这个代理IP。

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

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

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

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

 

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

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

浏览器获取投票接口

 

代码如下:

  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)

 

投票效果:

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

 

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

目前评论:1   其中:访客  1   博主  0

    • 八赚软件站 0

      现在这个网站的代理质量太差了。。 :cry: