攀岩只是为了好玩网校头条,只是为了学习,没有其他目的
这几天都在高考派上查招生信息,走了很多弯路,也学到了很多东西。
以下是涉及的模块
import requests
from fake_useragent import UserAgent
from multiprocessing import Process
import urllib.request as r
import threading
import re
import time
import random
首先我们来看看需要爬取的网页
不同的学校对应着文理科,以及全国各省确定招生计划。点击搜索,可以得到一个请求页面,这个页面是通过ajax实现的。
发送的数据如下
通过多个页面对比可以知道,id指的是学校id,type 1或者2指的是文科或者理科,city自然就是城市编号,state 1或者0表示是否有招生计划。
所以我们需要先把所有的ID和城市获取出来并写入txt,这个是在首页用正则表达式实现的高考派,具体代码很简单,获取学校的文本文件和对应的网址、省份和身份证号码:
共有 3054 所大学
和 31 个省
然后向各个大学的URL发送请求,获取JSON数据。
#获取id列表
def getSchoolIdList():
#...
#获取city列表
def getCityIdList():
# ...
#获取请求数据列表
def getDataList(schoolId,cityId):
dataList = []
for sid in schoolId:
for cid in cityId:
for type in [1, 2]:
dataList.append('id={}&type={}&city={}&state=1'.format(sid, type, cid))
return dataList
也就是说一共有=条数据需要获取
而且考虑到数据量很大,为了防止被拦截,必须设置代理和不同的消息头
我是通过向代理网站发送请求来获取代理IP的(19元一天高考派,不过可以无限量),另外如果字典里是‘http’,就会报错,还有‘http’和‘http’都报错,不知道为什么,干脆从代理网站获取https的IP吧
#获取代理ip列表,其中有15个ip
def getProxyList():
url1 = 'http://api3.xiguadaili.com/ip/?tid=558070598680507&num=15&delay=1&category=2&protocol=https'
res = requests.get(url1)
proxyList &