
github:
目录
简介
提到爬虫,大部分人都会想到使用Scrapy工具,但是仅仅停留在会使用的阶段。为了增加对爬虫机制的理解,我们可以手动实现多线程的爬虫过程,同时,引入IP代理池进行基本的反爬操作。
本次使用天天基金网进行爬虫,该网站具有反爬机制,同时数量足够大,多线程效果较为明显。
技术路线
IP代理池# 返回一个可用代理,格式为ip:端口 # 该接口直接调用github代理池项目给的例子,故不保证该接口实时可用 # 建议自己搭建一个本地代理池,这样获取代理的速度更快 # 代理池搭建github地址 # 搭建完毕后,把下方的proxy.1again.cc改成你的your_server_ip,本地搭建的话可以写成127.0.0.1或者localhost def get_proxy(): data_json = requests.get(":35050/api/v1/proxy/?type=2").text data = json.loads(data_json) return data[data][proxy]多线程# 将所有基金代码放入先进先出FIFO队列中 # 队列的写入和读取都是阻塞的,故在多线程情况下不会乱 # 在不使用框架的前提下,引入多线程,提高爬取效率 # 创建一个队列 fund_code_queue = queue.Queue(len(fund_code_list)) # 写入基金代码数据到队列 for i in range(len(fund_code_list)): #fund_code_list[i]也是list类型,其中该list中的第0个元素存放基金代码 fund_code_queue.put(fund_code_list[i][0])# 获取基金数据 def get_fund_data(): # 当队列不为空时 while (not fund_code_queue.empty()): # 从队列读取一个基金代码 # 读取是阻塞操作 fund_code = fund_code_queue.get() # 获取一个代理,格式为ip:端口 proxy = get_proxy() # 获取一个随机user_agent和Referer header = {User-Agent: random.choice(user_agent_list), Referer: random.choice(referer_list) } try: req = requests.get("" + str(fund_code) + ".js", proxies={"http": proxy}, timeout=3, headers=header) except Exception: # 访问失败了,所以要把我们刚才取出的数据再放回去队列中 fund_code_queue.put(fund_code) print("访问失败,尝试使用其他代理访问")# 申请获取锁,此过程为阻塞等待状态,直到获取锁完毕 mutex_lock.acquire() # 追加数据写入csv文件,若文件不存在则自动创建 with open(./fund_data.csv, a+, encoding=utf-8) as csv_file: csv_writer = csv.writer(csv_file) data_list = [x for x in data_dict.values()] csv_writer.writerow(data_list) # 释放锁 mutex_lock.release()# 创建一个线程锁,防止多线程写入文件时发生错乱 mutex_lock = threading.Lock() # 线程数为50,在一定范围内,线程数越多,速度越快 for i in range(50): t = threading.Thread(target=get_fund_data,name=LoopThread+str(i)) t.start()爬虫与反爬# user_agent列表 user_agent_list = [ Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER, Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Download 732; .NET4.0C; .NET4.0E), Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.84 Safari/535.11 SE 2.X MetaSr 1.0, Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/4.4.3.4000 Chrome/30.0.1599.101 Safari/537.36, Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 UBrowser/4.0.3214.0 Safari/537.36 ] # referer列表 referer_list = [ http://fund.eastmoney.com/110022.html, http://fund.eastmoney.com/110023.html, http://fund.eastmoney.com/110024.html, http://fund.eastmoney.com/110025.html ] # 获取一个随机user_agent和Referer header = {User-Agent: random.choice(user_agent_list), Referer: random.choice(referer_list) }数据格式
,建信消费升级混合,2019-03-26,1.7740,1.7914,0.98,2019-03-27 15:00
000031,华夏复兴混合,2019-03-26,1.5650,1.5709,0.38,2019-03-27 15:00
000048,华夏双债增强债券C,2019-03-26,1.2230,1.2236,0.05,2019-03-27 15:00
000008,嘉实中证500ETF联接A,2019-03-26,1.4417,1.4552,0.93,2019-03-27 15:00
000024,大摩双利增强债券A,2019-03-26,1.1670,1.1674,0.04,2019-03-27 15:00
000054,鹏华双债增利债券,2019-03-26,1.1697,1.1693,-0.03,2019-03-27 15:00
000016,华夏纯债债券C,2019-03-26,1.1790,1.1793,0.03,2019-03-27 15:00