无聊爬爬,仅供学习,无其他用途
这几天在高考派(http://www.gaokaopai.com/)上爬招生信息,其中也绕了不少弯路也学到了许多。
以下为涉及到的模块
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,tpye为1或2指的是文科或理科,city自然是城市号,state为1或0表示有或无招生计划。
所以我们需要先获取全部id和city并写入到txt中,这部分通过在首页中使用BeautifulSoup和正则来实现,具体代码很简单,得到学校和对应的url、省份与id号的文本文件:
一共有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
也就是说一共有3054x31x2=189348个数据需要获取
并且考虑到是大量数据,为了防止被封还得设置代理以及不同的消息头
我是通过向代理网站发送请求获取代理ip(19块一天,不过能无限取),另外在proxies字典中如果是'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 = []
for ip in res.text.split('\r\n'):