爬虫——获取联行行号
先來吐槽一下,突然接到一個任務,要我收集所有的聯行行號,由于網絡的原因,我開始訪問頁面都很慢,我就想著去網上找找現成的,結果CSDN上果然有好多人上傳的,但是由于很早以前CSDN升級以后,賬號全都要解封,我這個人記性不好,密碼什么的都忘記了,連賬號都模糊了,所以就讓朋友幫忙下載,結果需要C幣,我朋友的剛好還不夠,我就很無奈了。再次想要寫博客的時候,那時候我曾在CSDN和博客園猶豫過,后來選擇博客園的主要原因是,改密碼方便,這個密碼我真記不住,每次需要輸密碼的時候,果斷找回,然后重新來。但是CSDN的找回密碼簡直逆天的繁瑣。言歸正傳:
聯行行號,我的理解就是每個銀行的注冊編號,與銀行名稱一一對應且唯一。
目前能直觀的得到數據的有兩個網站,那么就相當于找到了數據源:
http://www.lianhanghao.com
http://www.eoeit.cn/lianhanghao/index.php
簡單說一下上面兩個數據源的區別:
第一點,1號數據源的響應速度快,2號數據源的響應速度慢;第二點,1號數據源中的數據有摻入別的字符,數據不純,2號數據源的數據不含其他無用字符;第三點,1號數據源的數據結構相對完整,2號數據源的數據結構不一定完整;第四點,1號數據源的數據量少,2號數據源的數據量多(差的不是很多)
兩個數據源的數據都抓了,基本的代碼邏輯是一樣的,直接上代碼(python,稍微說一下,隨著中基本上只使用一次的爬蟲,沒必要花很多時間寫的很完整,只要不出大的問題,一次性過了就不要了,不用花太多時間架構代碼)
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3
4 # @Author : mario
5 # @File : bank_code_crawler.py
6 # @Project : reptillian
7 # @Time : 2018-09-10 20:47:35
8 # @Desc : File is ...
9 import datetime
10 import threading
11
12 import requests
13 from pyquery import PyQuery as pq
14
15
16 def get_data(i):
17 # 每個線程抓664頁數據
18 print("第" + str(i) + "號啟動線程")
19 file = open("線程" + str(i) + "收集的數據.txt", 'w', encoding="utf-8")
20 for page in range((i - 1) * 664, i * 664):
21 # for page in range(6455-1, 6455): # 這行代碼用來補充數據
22 try:
23 url = "http://www.eoeit.cn/lianhanghao/index.php?page=" + str(page + 1)
24 response = requests.get(url, "b")
25 html = response.text
26 tbody = pq(html)("tbody")
27 trs = pq(tbody)("tr")
28 for tr in trs:
29 data = pq(tr)("td").text().replace(" ", ",")
30 file.write(data)
31 file.write("
")
32 file.flush()
33 except Exception as e:
34 file.write("====抓去第"+str(page+1)+"頁面數據異常
")
35 print(e)
36 print("第" + str(page + 1) + "頁數據")
37 file.close()
38 end_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
39 print(end_time)
40
41
42 def init_threads(threads, number):
43 for i in range(0, number):
44 t = threading.Thread(target=get_data, args=(i + 1,))
45 threads.append(t)
46 return threads
47
48
49 if __name__ == "__main__":
50 begin_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
51 print(begin_time)
52 # 初始化線程
53 threads = []
54 init_threads(threads, 10)
55 # 啟動線程
56 for thread in threads:
57 thread.start()
以上就是整個爬蟲的代碼,核心的代碼只有10行左右,線程是后來加上去的,但是基本上沒有什么用。
補充說明:
第一點:10個線程太多了,還是會導致服務器拒絕連接,簡單的解決方案就是,雖然定義了線程,但每次還是1個線程跑,比如:初始化的時候傳入了threads和10,但是在初始化方法的for循環中寫成 for i in range(9,number):我是懶得重新在寫代碼,對于一次性的,這樣改我覺得方便,不用考慮后期維護什么的,因為這種一次性的爬蟲是沒有后期的。
第二點:代碼第21行,是用來解決如下現象:比如,比如第2000頁的數據請求時出了問題,那么我不想讓程序停下來,繼續抓2001頁的數據,這樣最后的結果就會少了一些頁面的數據,最后用這個稍微補充一下,然后整理數據就可以了。
好像沒有找到上傳附件的地方,不過如果有誰需要可以聯系我,大概數據在13W左右吧。
總結
以上是生活随笔為你收集整理的爬虫——获取联行行号的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小米8se从miui12降级刷机手记
- 下一篇: 使用 Python 5 年后,我转向了G