更新時(shí)間:2024-07-05 07:02:22作者:佚名
攀巖只是為了好玩網(wǎng)校頭條,只是為了學(xué)習(xí),沒有其他目的
這幾天都在高考派上查招生信息,走了很多彎路,也學(xué)到了很多東西。
以下是涉及的模塊
import requests
from fake_useragent import UserAgent
from multiprocessing import Process
import urllib.request as r
import threading
import re
import time
import random
首先我們來看看需要爬取的網(wǎng)頁
不同的學(xué)校對(duì)應(yīng)著文理科,以及全國各省確定招生計(jì)劃。點(diǎn)擊搜索,可以得到一個(gè)請(qǐng)求頁面,這個(gè)頁面是通過ajax實(shí)現(xiàn)的。
發(fā)送的數(shù)據(jù)如下
通過多個(gè)頁面對(duì)比可以知道,id指的是學(xué)校id,type 1或者2指的是文科或者理科,city自然就是城市編號(hào),state 1或者0表示是否有招生計(jì)劃。
所以我們需要先把所有的ID和城市獲取出來并寫入txt,這個(gè)是在首頁用正則表達(dá)式實(shí)現(xiàn)的高考派,具體代碼很簡單,獲取學(xué)校的文本文件和對(duì)應(yīng)的網(wǎng)址、省份和身份證號(hào)碼:
共有 3054 所大學(xué)
和 31 個(gè)省
然后向各個(gè)大學(xué)的URL發(fā)送請(qǐng)求,獲取JSON數(shù)據(jù)。
#獲取id列表
def getSchoolIdList():
#...
#獲取city列表
def getCityIdList():
# ...
#獲取請(qǐng)求數(shù)據(jù)列表
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
也就是說一共有=條數(shù)據(jù)需要獲取
而且考慮到數(shù)據(jù)量很大,為了防止被攔截,必須設(shè)置代理和不同的消息頭
我是通過向代理網(wǎng)站發(fā)送請(qǐng)求來獲取代理IP的(19元一天高考派,不過可以無限量),另外如果字典里是‘http’,就會(huì)報(bào)錯(cuò),還有‘http’和‘http’都報(bào)錯(cuò),不知道為什么,干脆從代理網(wǎng)站獲取https的IP吧
#獲取代理ip列表,其中有15個(gè)ip
def getProxyList():
url1 = 'http://api3.xiguadaili.com/ip/?tid=558070598680507&num=15&delay=1&category=2&protocol=https'
res = requests.get(url1)
proxyList &