前兩天有人私信我,讓我爬這個網站,http://bbs.baobeihuijia.com/f...上的失蹤兒童信息,準備根據失蹤兒童的失蹤時的地理位置來更好的尋找失蹤兒童,這種事情本就應該責無旁貸,若是對網站服務器形成負荷,還請諒解。html
此次依然是用第三方爬蟲包BeautifulSoup,還有Selenium+Chrome,Selenium+PhantomJS來爬取信息。
經過分析網站的框架,依然分三步來進行。python
步驟一:獲取http://bbs.baobeihuijia.com/f...這個版塊上的全部分頁頁面連接
步驟二:獲取每個分頁連接上所發的帖子的連接
步驟三:獲取每個帖子連接上要爬取的信息,編號,姓名,性別,出生日期,失蹤時身高,失蹤時間,失蹤地點,以及是否報案web
起先用的BeautifulSoup,可是被管理員設置了網站重定向,而後就採用selenium的方式,在這裏仍是對網站管理員說一聲抱歉。chrome
一、獲取http://bbs.baobeihuijia.com/f...這個版塊上的全部分頁頁面連接瀏覽器
經過分析:發現分頁的頁面連接處於<div class="pg">下,因此寫了如下的代碼
BeautifulSoup形式:服務器
[python] view plain copy 1.def GetALLPageUrl(siteUrl): 2. #設置代理IP訪問 3. #代理IP能夠上http://http.zhimaruanjian.com/獲取 4. proxy_handler=urllib.request.ProxyHandler({'https':'111.76.129.200:808'}) 5. proxy_auth_handler=urllib.request.ProxyBasicAuthHandler() 6. opener = urllib.request.build_opener(urllib.request.HTTPHandler, proxy_handler) 7. urllib.request.install_opener(opener) 8. #獲取網頁信息 9. req=request.Request(siteUrl,headers=headers1 or headers2 or headers3) 10. html=urlopen(req) 11. bsObj=BeautifulSoup(html.read(),"html.parser") 12. html.close() 13. #http://bbs.baobeihuijia.com/forum-191-1.html變成http://bbs.baobeihuijia.com,以便組成頁面連接 14. siteindex=siteUrl.rfind("/") 15. tempsiteurl=siteUrl[0:siteindex+1]#http://bbs.baobeihuijia.com/ 16. tempbianhaoqian=siteUrl[siteindex+1:-6]#forum-191- 17. 18. #爬取想要的信息 19. bianhao=[]#存儲頁面編號 20. pageUrl=[]#存儲頁面連接 21. templist1=bsObj.find("div",{"class":"pg"}) 22. for templist2 in templist1.findAll("a",href=re.compile("forum-([0-9]+)-([0-9]+).html")): 23. lianjie=templist2.attrs['href'] 24. #print(lianjie) 25. index1=lianjie.rfind("-")#查找-在字符串中的位置 26. index2=lianjie.rfind(".")#查找.在字符串中的位置 27. tempbianhao=lianjie[index1+1:index2] 28. bianhao.append(int(tempbianhao)) 29. bianhaoMax=max(bianhao)#獲取頁面的最大編號 30. 31. for i in range(1,bianhaoMax+1): 32. temppageUrl=tempsiteurl+tempbianhaoqian+str(i)+".html"#組成頁面連接 33. #print(temppageUrl) 34. pageUrl.append(temppageUrl) 35. return pageUrl#返回頁面連接列表 Selenium形式: [python] view plain copy 1.#獲得當前板塊全部的頁面連接 2.#siteUrl爲當前版塊的頁面連接 3.def GetALLPageUrl(siteUrl): 4. #設置代理IP訪問 5. #代理IP能夠上http://http.zhimaruanjian.com/獲取 6. proxy_handler=urllib.request.ProxyHandler({'post':'123.207.143.51:8080'}) 7. proxy_auth_handler=urllib.request.ProxyBasicAuthHandler() 8. opener = urllib.request.build_opener(urllib.request.HTTPHandler, proxy_handler) 9. urllib.request.install_opener(opener) 10. 11. try: 12. #掉用第三方包selenium打開瀏覽器登錄 13. #driver=webdriver.Chrome()#打開chrome 14. driver=webdriver.Chrome()#打開無界面瀏覽器Chrome 15. #driver=webdriver.PhantomJS()#打開無界面瀏覽器PhantomJS 16. driver.set_page_load_timeout(10) 17. #driver.implicitly_wait(30) 18. try: 19. driver.get(siteUrl)#登錄兩次 20. driver.get(siteUrl) 21. except TimeoutError: 22. driver.refresh() 23. 24. #print(driver.page_source) 25. html=driver.page_source#將瀏覽器執行後的源代碼賦給html 26. #獲取網頁信息 27. #抓捕網頁解析過程當中的錯誤 28. try: 29. #req=request.Request(tieziUrl,headers=headers5) 30. #html=urlopen(req) 31. bsObj=BeautifulSoup(html,"html.parser") 32. #print(bsObj.find('title').get_text()) 33. #html.close() 34. except UnicodeDecodeError as e: 35. print("-----UnicodeDecodeError url",siteUrl) 36. except urllib.error.URLError as e: 37. print("-----urlError url:",siteUrl) 38. except socket.timeout as e: 39. print("-----socket timout:",siteUrl) 40. 41. 42. 43. while(bsObj.find('title').get_text() == "頁面重載開啓"): 44. print("當前頁面不是重加載後的頁面,程序會嘗試刷新一次到跳轉後的頁面\n") 45. driver.get(siteUrl) 46. html=driver.page_source#將瀏覽器執行後的源代碼賦給html 47. bsObj=BeautifulSoup(html,"html.parser") 48. except Exception as e: 49. 50. driver.close() # Close the current window. 51. driver.quit()#關閉chrome瀏覽器 52. #time.sleep() 53. 54. driver.close() # Close the current window. 55. driver.quit()#關閉chrome瀏覽器 56. 57. 58. #http://bbs.baobeihuijia.com/forum-191-1.html變成http://bbs.baobeihuijia.com,以便組成頁面連接 59. siteindex=siteUrl.rfind("/") 60. tempsiteurl=siteUrl[0:siteindex+1]#http://bbs.baobeihuijia.com/ 61. tempbianhaoqian=siteUrl[siteindex+1:-6]#forum-191- 62. 63. #爬取想要的信息 64. bianhao=[]#存儲頁面編號 65. pageUrl=[]#存儲頁面連接 66. 67. templist1=bsObj.find("div",{"class":"pg"}) 68. #if templist1==None: 69. #return 70. for templist2 in templist1.findAll("a",href=re.compile("forum-([0-9]+)-([0-9]+).html")): 71. if templist2==None: 72. continue 73. lianjie=templist2.attrs['href'] 74. #print(lianjie) 75. index1=lianjie.rfind("-")#查找-在字符串中的位置 76. index2=lianjie.rfind(".")#查找.在字符串中的位置 77. tempbianhao=lianjie[index1+1:index2] 78. bianhao.append(int(tempbianhao)) 79. bianhaoMax=max(bianhao)#獲取頁面的最大編號 80. 81. for i in range(1,bianhaoMax+1): 82. temppageUrl=tempsiteurl+tempbianhaoqian+str(i)+".html"#組成頁面連接 83. print(temppageUrl) 84. pageUrl.append(temppageUrl) 85. return pageUrl#返回頁面連接列表
2.獲取每個分頁連接上所發的帖子的連接網絡
每一個帖子的連接都位於href下
因此寫了如下的代碼:
BeautifulSoup形式:app
[python] view plain copy 1.#獲得當前版塊頁面全部帖子的連接 2.def GetCurrentPageTieziUrl(PageUrl): 3. #設置代理IP訪問 4. #代理IP能夠上http://http.zhimaruanjian.com/獲取 5. proxy_handler=urllib.request.ProxyHandler({'post':'121.22.252.85:8000'}) 6. proxy_auth_handler=urllib.request.ProxyBasicAuthHandler() 7. opener = urllib.request.build_opener(urllib.request.HTTPHandler, proxy_handler) 8. urllib.request.install_opener(opener) 9. #獲取網頁信息 10. req=request.Request(PageUrl,headers=headers1 or headers2 or headers3) 11. html=urlopen(req) 12. bsObj=BeautifulSoup(html.read(),"html.parser") 13. html.close() 14. #http://bbs.baobeihuijia.com/forum-191-1.html變成http://bbs.baobeihuijia.com,以便組成帖子連接 15. siteindex=PageUrl.rfind("/") 16. tempsiteurl=PageUrl[0:siteindex+1]#http://bbs.baobeihuijia.com/ 17. #print(tempsiteurl) 18. TieziUrl=[] 19. #爬取想要的信息 20. for templist1 in bsObj.findAll("tbody",id=re.compile("normalthread_([0-9]+)")) : 21. for templist2 in templist1.findAll("a",{"class":"s xst"}): 22. tempteiziUrl=tempsiteurl+templist2.attrs['href']#組成帖子連接 23. print(tempteiziUrl) 24. TieziUrl.append(tempteiziUrl) 25. return TieziUrl#返回帖子連接列表 Selenium形式: [python] view plain copy 1.#獲得當前版塊頁面全部帖子的連接 2.def GetCurrentPageTieziUrl(PageUrl): 3. #設置代理IP訪問 4. #代理IP能夠上http://http.zhimaruanjian.com/獲取 5. proxy_handler=urllib.request.ProxyHandler({'post':'110.73.30.157:8123'}) 6. proxy_auth_handler=urllib.request.ProxyBasicAuthHandler() 7. opener = urllib.request.build_opener(urllib.request.HTTPHandler, proxy_handler) 8. urllib.request.install_opener(opener) 9. 10. try: 11. #掉用第三方包selenium打開瀏覽器登錄 12. #driver=webdriver.Chrome()#打開chrome 13. driver=webdriver.Chrome()#打開無界面瀏覽器Chrome 14. #driver=webdriver.PhantomJS()#打開無界面瀏覽器PhantomJS 15. driver.set_page_load_timeout(10) 16. try: 17. driver.get(PageUrl)#登錄兩次 18. driver.get(PageUrl) 19. except TimeoutError: 20. driver.refresh() 21. 22. #print(driver.page_source) 23. html=driver.page_source#將瀏覽器執行後的源代碼賦給html 24. #獲取網頁信息 25. #抓捕網頁解析過程當中的錯誤 26. try: 27. #req=request.Request(tieziUrl,headers=headers5) 28. #html=urlopen(req) 29. bsObj=BeautifulSoup(html,"html.parser") 30. #html.close() 31. except UnicodeDecodeError as e: 32. print("-----UnicodeDecodeError url",PageUrl) 33. except urllib.error.URLError as e: 34. print("-----urlError url:",PageUrl) 35. except socket.timeout as e: 36. print("-----socket timout:",PageUrl) 37. 38. n=0 39. while(bsObj.find('title').get_text() == "頁面重載開啓"): 40. print("當前頁面不是重加載後的頁面,程序會嘗試刷新一次到跳轉後的頁面\n") 41. driver.get(PageUrl) 42. html=driver.page_source#將瀏覽器執行後的源代碼賦給html 43. bsObj=BeautifulSoup(html,"html.parser") 44. n=n+1 45. if n==10: 46. driver.close() # Close the current window. 47. driver.quit()#關閉chrome瀏覽器 48. return 1 49. 50. except Exception as e: 51. driver.close() # Close the current window. 52. driver.quit()#關閉chrome瀏覽器 53. time.sleep(1) 54. 55. driver.close() # Close the current window. 56. driver.quit()#關閉chrome瀏覽器 57. 58. 59. #http://bbs.baobeihuijia.com/forum-191-1.html變成http://bbs.baobeihuijia.com,以便組成帖子連接 60. siteindex=PageUrl.rfind("/") 61. tempsiteurl=PageUrl[0:siteindex+1]#http://bbs.baobeihuijia.com/ 62. #print(tempsiteurl) 63. TieziUrl=[] 64. #爬取想要的信息 65. for templist1 in bsObj.findAll("tbody",id=re.compile("normalthread_([0-9]+)")) : 66. if templist1==None: 67. continue 68. for templist2 in templist1.findAll("a",{"class":"s xst"}): 69. if templist2==None: 70. continue 71. tempteiziUrl=tempsiteurl+templist2.attrs['href']#組成帖子連接 72. print(tempteiziUrl) 73. TieziUrl.append(tempteiziUrl) 74. return TieziUrl#返回帖子連接列表
3.獲取每個帖子連接上要爬取的信息,編號,姓名,性別,出生日期,失蹤時身高,失蹤時間,失蹤地點,以及是否報案,並寫入CSV中框架
經過查看每個帖子的連接,發現其失蹤人口信息都在<ul>標籤下,因此編寫了如下的代碼
BeautifulSoup形式:socket
[python] view plain copy 1.#獲得當前頁面失蹤人口信息 2.#pageUrl爲當前帖子頁面連接 3.def CurrentPageMissingPopulationInformation(tieziUrl): 4. #設置代理IP訪問 5. #代理IP能夠上http://http.zhimaruanjian.com/獲取 6. proxy_handler=urllib.request.ProxyHandler({'post':'210.136.17.78:8080'}) 7. proxy_auth_handler=urllib.request.ProxyBasicAuthHandler() 8. opener = urllib.request.build_opener(urllib.request.HTTPHandler, proxy_handler) 9. urllib.request.install_opener(opener) 10. #獲取網頁信息 11. req=request.Request(tieziUrl,headers=headers1 or headers2 or headers3) 12. html=urlopen(req) 13. bsObj=BeautifulSoup(html.read(),"html.parser") 14. html.close() 15. #查找想要的信息 16. templist1=bsObj.find("td",{"class":"t_f"}).ul 17. if templist1==None:#判斷是否不包含ul字段,若是不,跳出函數 18. return 19. mycsv=['NULL','NULL','NULL','NULL','NULL','NULL','NULL','NULL']#初始化提取信息列表 20. for templist2 in templist1.findAll("font",size=re.compile("^([0-9]+)*$")): 21. if len(templist2)==0: 22. continue 23. tempText=templist2.get_text() 24. #print(tempText[0:4]) 25. if "寶貝回家編號" in tempText[0:6]: 26. print(tempText) 27. index=tempText.find(":") 28. tempText=tempText[index+1:] 29. #mycsv.append(tempText) 30. if len(tempText)==0: 31. tempText="NULL" 32. mycsv[0]=tempText 33. if "尋親編號" in tempText[0:6]: 34. print(tempText) 35. index=tempText.find(":") 36. tempText=tempText[index+1:] 37. if len(tempText)==0: 38. tempText="NULL" 39. #mycsv.append(tempText) 40. mycsv[0]=tempText 41. if "登記編號" in tempText[0:6]: 42. print(tempText) 43. index=tempText.find(":") 44. tempText=tempText[index+1:] 45. if len(tempText)==0: 46. tempText="NULL" 47. #mycsv.append(tempText) 48. mycsv[0]=tempText 49. if "姓" in tempText[0:6]: 50. print(tempText) 51. index=tempText.find(":") 52. tempText=tempText[index+1:] 53. #mycsv.append(tempText) 54. mycsv[1]=tempText 55. if"性" in tempText[0:6]: 56. print(tempText) 57. index=tempText.find(":") 58. tempText=tempText[index+1:] 59. #mycsv.append(tempText) 60. mycsv[2]=tempText 61. if "出生日期" in tempText[0:6]: 62. print(tempText) 63. index=tempText.find(":") 64. tempText=tempText[index+1:] 65. #mycsv.append(tempText) 66. mycsv[3]=tempText 67. if "失蹤時身高" in tempText[0:6]: 68. print(tempText) 69. index=tempText.find(":") 70. tempText=tempText[index+1:] 71. #mycsv.append(tempText) 72. mycsv[4]=tempText 73. if "失蹤時間" in tempText[0:6]: 74. print(tempText) 75. index=tempText.find(":") 76. tempText=tempText[index+1:] 77. #mycsv.append(tempText) 78. mycsv[5]=tempText 79. if "失蹤日期" in tempText[0:6]: 80. print(tempText) 81. index=tempText.find(":") 82. tempText=tempText[index+1:] 83. #mycsv.append(tempText) 84. mycsv[5]=tempText 85. if "失蹤地點" in tempText[0:6]: 86. print(tempText) 87. index=tempText.find(":") 88. tempText=tempText[index+1:] 89. #mycsv.append(tempText) 90. mycsv[6]=tempText 91. if "是否報案" in tempText[0:6]: 92. print(tempText) 93. index=tempText.find(":") 94. tempText=tempText[index+1:] 95. #mycsv.append(tempText) 96. mycsv[7]=tempText 97. try: 98. writer.writerow((str(mycsv[0]),str(mycsv[1]),str(mycsv[2]),str(mycsv[3]),str(mycsv[4]),str(mycsv[5]),str(mycsv[6]),str(mycsv[7])))#寫入CSV文件 99. finally: 100. time.sleep(1)#設置爬完以後的睡眠時間,這裏先設置爲1秒
Selenium形式:
[python] view plain copy 1.#獲得當前頁面失蹤人口信息 2.#pageUrl爲當前帖子頁面連接 3.def CurrentPageMissingPopulationInformation(tieziUrl): 4. #設置代理IP訪問 5. #代理IP能夠上http://http.zhimaruanjian.com/獲取 6. proxy_handler=urllib.request.ProxyHandler({'post':'128.199.169.17:80'}) 7. proxy_auth_handler=urllib.request.ProxyBasicAuthHandler() 8. opener = urllib.request.build_opener(urllib.request.HTTPHandler, proxy_handler) 9. urllib.request.install_opener(opener) 10. 11. try: 12. #掉用第三方包selenium打開瀏覽器登錄 13. #driver=webdriver.Chrome()#打開chrome 14. driver=webdriver.Chrome()#打開無界面瀏覽器Chrome 15. #driver=webdriver.PhantomJS()#打開無界面瀏覽器PhantomJS 16. driver.set_page_load_timeout(10) 17. #driver.implicitly_wait(30) 18. try: 19. driver.get(tieziUrl)#登錄兩次 20. driver.get(tieziUrl) 21. except TimeoutError: 22. driver.refresh() 23. 24. #print(driver.page_source) 25. html=driver.page_source#將瀏覽器執行後的源代碼賦給html 26. #獲取網頁信息 27. #抓捕網頁解析過程當中的錯誤 28. try: 29. #req=request.Request(tieziUrl,headers=headers5) 30. #html=urlopen(req) 31. bsObj=BeautifulSoup(html,"html.parser") 32. #html.close() 33. except UnicodeDecodeError as e: 34. print("-----UnicodeDecodeError url",tieziUrl) 35. except urllib.error.URLError as e: 36. print("-----urlError url:",tieziUrl) 37. except socket.timeout as e: 38. print("-----socket timout:",tieziUrl) 39. 40. 41. while(bsObj.find('title').get_text() == "頁面重載開啓"): 42. print("當前頁面不是重加載後的頁面,程序會嘗試刷新一次到跳轉後的頁面\n") 43. driver.get(tieziUrl) 44. html=driver.page_source#將瀏覽器執行後的源代碼賦給html 45. bsObj=BeautifulSoup(html,"html.parser") 46. except Exception as e: 47. driver.close() # Close the current window. 48. driver.quit()#關閉chrome瀏覽器 49. time.sleep(0.5) 50. 51. driver.close() # Close the current window. 52. driver.quit()#關閉chrome瀏覽器 53. 54. 55. #查找想要的信息 56. templist1=bsObj.find("td",{"class":"t_f"}).ul 57. if templist1==None:#判斷是否不包含ul字段,若是不,跳出函數 58. print("當前帖子頁面不包含ul字段") 59. return 1 60. mycsv=['NULL','NULL','NULL','NULL','NULL','NULL','NULL','NULL']#初始化提取信息列表 61. for templist2 in templist1.findAll("font",size=re.compile("^([0-9]+)*$")): 62. tempText=templist2.get_text() 63. #print(tempText[0:4]) 64. if "寶貝回家編號" in tempText[0:6]: 65. print(tempText) 66. index=tempText.find(":") 67. tempText=tempText[index+1:] 68. #mycsv.append(tempText) 69. if len(tempText)==0: 70. tempText="NULL" 71. mycsv[0]=tempText 72. if "尋親編號" in tempText[0:6]: 73. print(tempText) 74. index=tempText.find(":") 75. tempText=tempText[index+1:] 76. if len(tempText)==0: 77. tempText="NULL" 78. #mycsv.append(tempText) 79. mycsv[0]=tempText 80. if "登記編號" in tempText[0:6]: 81. print(tempText) 82. index=tempText.find(":") 83. tempText=tempText[index+1:] 84. if len(tempText)==0: 85. tempText="NULL" 86. #mycsv.append(tempText) 87. mycsv[0]=tempText 88. if "姓" in tempText[0:6]: 89. print(tempText) 90. index=tempText.find(":") 91. tempText=tempText[index+1:] 92. #mycsv.append(tempText) 93. mycsv[1]=tempText 94. if"性" in tempText[0:6]: 95. print(tempText) 96. index=tempText.find(":") 97. tempText=tempText[index+1:] 98. #mycsv.append(tempText) 99. mycsv[2]=tempText 100. if "出生日期" in tempText[0:6]: 101. print(tempText) 102. index=tempText.find(":") 103. tempText=tempText[index+1:] 104. #mycsv.append(tempText) 105. mycsv[3]=tempText 106. if "失蹤時身高" in tempText[0:6]: 107. print(tempText) 108. index=tempText.find(":") 109. tempText=tempText[index+1:] 110. #mycsv.append(tempText) 111. mycsv[4]=tempText 112. if "失蹤時間" in tempText[0:6]: 113. print(tempText) 114. index=tempText.find(":") 115. tempText=tempText[index+1:] 116. #mycsv.append(tempText) 117. mycsv[5]=tempText 118. if "失蹤日期" in tempText[0:6]: 119. print(tempText) 120. index=tempText.find(":") 121. tempText=tempText[index+1:] 122. #mycsv.append(tempText) 123. mycsv[5]=tempText 124. if "失蹤地點" in tempText[0:6]: 125. print(tempText) 126. index=tempText.find(":") 127. tempText=tempText[index+1:] 128. #mycsv.append(tempText) 129. mycsv[6]=tempText 130. if "是否報案" in tempText[0:6]: 131. print(tempText) 132. index=tempText.find(":") 133. tempText=tempText[index+1:] 134. #mycsv.append(tempText) 135. mycsv[7]=tempText 136. try: 137. writer.writerow((str(mycsv[0]),str(mycsv[1]),str(mycsv[2]),str(mycsv[3]),str(mycsv[4]),str(mycsv[5]),str(mycsv[6]),str(mycsv[7])))#寫入CSV文件 138. csvfile.flush()#立刻將這條數據寫入csv文件中 139. finally: 140. print("當前帖子信息寫入完成\n") 141. time.sleep(5)#設置爬完以後的睡眠時間,這裏先設置爲1秒
現附上全部代碼,此代碼僅供參考,不能用於商業用途,網絡爬蟲易給網站服務器形成巨大負荷,任何人使用本代碼所引發的任何後果,本人不予承擔法律責任。貼出代碼的初衷是供你們學習爬蟲,你們只是研究下網絡框架便可,不要使用此代碼去加劇網站負荷,本人因爲不當使用,已被封IP,前車可鑑,爬取失蹤人口信息只是爲了從空間上分析人口失蹤的規律,由此給網站形成的什麼不便,請見諒。
附上全部代碼:
[python] view plain copy 1.#__author__ = 'Administrator' 2.#coding=utf-8 3.import io 4.import os 5.import sys 6.import math 7.import urllib 8.from urllib.request import urlopen 9.from urllib.request import urlretrieve 10.from urllib import request 11.from bs4 import BeautifulSoup 12.import re 13.import time 14.import socket 15.import csv 16.from selenium import webdriver 17. 18.socket.setdefaulttimeout(5000)#設置全局超時函數 19. 20. 21. 22.sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='gb18030') 23.#sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf-8') 24.#設置不一樣的headers,假裝爲不一樣的瀏覽器 25.headers1={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'} 26.headers2={'User-Agent':'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36'} 27.headers3={'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11'} 28.headers4={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.2372.400 QQBrowser/9.5.10548.400'} 29.headers5={'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 30.'Connection':'keep-alive', 31.'Host':'bbs.baobeihuijia.com', 32.'Referer':'http://bbs.baobeihuijia.com/forum-191-1.html', 33.'Upgrade-Insecure-Requests':'1', 34.'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36'} 35. 36.headers6={'Host': 'bbs.baobeihuijia.com', 37.'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0', 38.'Accept': 'textml,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 39.'Connection': 'keep-alive', 40.'Upgrade-Insecure-Requests':' 1' 41.} 42.#獲得當前頁面失蹤人口信息 43.#pageUrl爲當前帖子頁面連接 44.def CurrentPageMissingPopulationInformation(tieziUrl): 45. #設置代理IP訪問 46. #代理IP能夠上http://http.zhimaruanjian.com/獲取 47. proxy_handler=urllib.request.ProxyHandler({'post':'128.199.169.17:80'}) 48. proxy_auth_handler=urllib.request.ProxyBasicAuthHandler() 49. opener = urllib.request.build_opener(urllib.request.HTTPHandler, proxy_handler) 50. urllib.request.install_opener(opener) 51. 52. try: 53. #掉用第三方包selenium打開瀏覽器登錄 54. #driver=webdriver.Chrome()#打開chrome 55. driver=webdriver.Chrome()#打開無界面瀏覽器Chrome 56. #driver=webdriver.PhantomJS()#打開無界面瀏覽器PhantomJS 57. driver.set_page_load_timeout(10) 58. #driver.implicitly_wait(30) 59. try: 60. driver.get(tieziUrl)#登錄兩次 61. driver.get(tieziUrl) 62. except TimeoutError: 63. driver.refresh() 64. 65. #print(driver.page_source) 66. html=driver.page_source#將瀏覽器執行後的源代碼賦給html 67. #獲取網頁信息 68. #抓捕網頁解析過程當中的錯誤 69. try: 70. #req=request.Request(tieziUrl,headers=headers5) 71. #html=urlopen(req) 72. bsObj=BeautifulSoup(html,"html.parser") 73. #html.close() 74. except UnicodeDecodeError as e: 75. print("-----UnicodeDecodeError url",tieziUrl) 76. except urllib.error.URLError as e: 77. print("-----urlError url:",tieziUrl) 78. except socket.timeout as e: 79. print("-----socket timout:",tieziUrl) 80. 81. 82. while(bsObj.find('title').get_text() == "頁面重載開啓"): 83. print("當前頁面不是重加載後的頁面,程序會嘗試刷新一次到跳轉後的頁面\n") 84. driver.get(tieziUrl) 85. html=driver.page_source#將瀏覽器執行後的源代碼賦給html 86. bsObj=BeautifulSoup(html,"html.parser") 87. except Exception as e: 88. driver.close() # Close the current window. 89. driver.quit()#關閉chrome瀏覽器 90. time.sleep(0.5) 91. 92. driver.close() # Close the current window. 93. driver.quit()#關閉chrome瀏覽器 94. 95. 96. #查找想要的信息 97. templist1=bsObj.find("td",{"class":"t_f"}).ul 98. if templist1==None:#判斷是否不包含ul字段,若是不,跳出函數 99. print("當前帖子頁面不包含ul字段") 100. return 1 101. mycsv=['NULL','NULL','NULL','NULL','NULL','NULL','NULL','NULL']#初始化提取信息列表 102. for templist2 in templist1.findAll("font",size=re.compile("^([0-9]+)*$")): 103. tempText=templist2.get_text() 104. #print(tempText[0:4]) 105. if "寶貝回家編號" in tempText[0:6]: 106. print(tempText) 107. index=tempText.find(":") 108. tempText=tempText[index+1:] 109. #mycsv.append(tempText) 110. if len(tempText)==0: 111. tempText="NULL" 112. mycsv[0]=tempText 113. if "尋親編號" in tempText[0:6]: 114. print(tempText) 115. index=tempText.find(":") 116. tempText=tempText[index+1:] 117. if len(tempText)==0: 118. tempText="NULL" 119. #mycsv.append(tempText) 120. mycsv[0]=tempText 121. if "登記編號" in tempText[0:6]: 122. print(tempText) 123. index=tempText.find(":") 124. tempText=tempText[index+1:] 125. if len(tempText)==0: 126. tempText="NULL" 127. #mycsv.append(tempText) 128. mycsv[0]=tempText 129. if "姓" in tempText[0:6]: 130. print(tempText) 131. index=tempText.find(":") 132. tempText=tempText[index+1:] 133. #mycsv.append(tempText) 134. mycsv[1]=tempText 135. if"性" in tempText[0:6]: 136. print(tempText) 137. index=tempText.find(":") 138. tempText=tempText[index+1:] 139. #mycsv.append(tempText) 140. mycsv[2]=tempText 141. if "出生日期" in tempText[0:6]: 142. print(tempText) 143. index=tempText.find(":") 144. tempText=tempText[index+1:] 145. #mycsv.append(tempText) 146. mycsv[3]=tempText 147. if "失蹤時身高" in tempText[0:6]: 148. print(tempText) 149. index=tempText.find(":") 150. tempText=tempText[index+1:] 151. #mycsv.append(tempText) 152. mycsv[4]=tempText 153. if "失蹤時間" in tempText[0:6]: 154. print(tempText) 155. index=tempText.find(":") 156. tempText=tempText[index+1:] 157. #mycsv.append(tempText) 158. mycsv[5]=tempText 159. if "失蹤日期" in tempText[0:6]: 160. print(tempText) 161. index=tempText.find(":") 162. tempText=tempText[index+1:] 163. #mycsv.append(tempText) 164. mycsv[5]=tempText 165. if "失蹤地點" in tempText[0:6]: 166. print(tempText) 167. index=tempText.find(":") 168. tempText=tempText[index+1:] 169. #mycsv.append(tempText) 170. mycsv[6]=tempText 171. if "是否報案" in tempText[0:6]: 172. print(tempText) 173. index=tempText.find(":") 174. tempText=tempText[index+1:] 175. #mycsv.append(tempText) 176. mycsv[7]=tempText 177. try: 178. writer.writerow((str(mycsv[0]),str(mycsv[1]),str(mycsv[2]),str(mycsv[3]),str(mycsv[4]),str(mycsv[5]),str(mycsv[6]),str(mycsv[7])))#寫入CSV文件 179. csvfile.flush()#立刻將這條數據寫入csv文件中 180. finally: 181. print("當前帖子信息寫入完成\n") 182. time.sleep(5)#設置爬完以後的睡眠時間,這裏先設置爲1秒 183. 184. 185.#獲得當前板塊全部的頁面連接 186.#siteUrl爲當前版塊的頁面連接 187.def GetALLPageUrl(siteUrl): 188. #設置代理IP訪問 189. #代理IP能夠上http://http.zhimaruanjian.com/獲取 190. proxy_handler=urllib.request.ProxyHandler({'post':'123.207.143.51:8080'}) 191. proxy_auth_handler=urllib.request.ProxyBasicAuthHandler() 192. opener = urllib.request.build_opener(urllib.request.HTTPHandler, proxy_handler) 193. urllib.request.install_opener(opener) 194. 195. try: 196. #掉用第三方包selenium打開瀏覽器登錄 197. #driver=webdriver.Chrome()#打開chrome 198. driver=webdriver.Chrome()#打開無界面瀏覽器Chrome 199. #driver=webdriver.PhantomJS()#打開無界面瀏覽器PhantomJS 200. driver.set_page_load_timeout(10) 201. #driver.implicitly_wait(30) 202. try: 203. driver.get(siteUrl)#登錄兩次 204. driver.get(siteUrl) 205. except TimeoutError: 206. driver.refresh() 207. 208. #print(driver.page_source) 209. html=driver.page_source#將瀏覽器執行後的源代碼賦給html 210. #獲取網頁信息 211. #抓捕網頁解析過程當中的錯誤 212. try: 213. #req=request.Request(tieziUrl,headers=headers5) 214. #html=urlopen(req) 215. bsObj=BeautifulSoup(html,"html.parser") 216. #print(bsObj.find('title').get_text()) 217. #html.close() 218. except UnicodeDecodeError as e: 219. print("-----UnicodeDecodeError url",siteUrl) 220. except urllib.error.URLError as e: 221. print("-----urlError url:",siteUrl) 222. except socket.timeout as e: 223. print("-----socket timout:",siteUrl) 224. 225. 226. 227. while(bsObj.find('title').get_text() == "頁面重載開啓"): 228. print("當前頁面不是重加載後的頁面,程序會嘗試刷新一次到跳轉後的頁面\n") 229. driver.get(siteUrl) 230. html=driver.page_source#將瀏覽器執行後的源代碼賦給html 231. bsObj=BeautifulSoup(html,"html.parser") 232. except Exception as e: 233. 234. driver.close() # Close the current window. 235. driver.quit()#關閉chrome瀏覽器 236. #time.sleep() 237. 238. driver.close() # Close the current window. 239. driver.quit()#關閉chrome瀏覽器 240. 241. 242. #http://bbs.baobeihuijia.com/forum-191-1.html變成http://bbs.baobeihuijia.com,以便組成頁面連接 243. siteindex=siteUrl.rfind("/") 244. tempsiteurl=siteUrl[0:siteindex+1]#http://bbs.baobeihuijia.com/ 245. tempbianhaoqian=siteUrl[siteindex+1:-6]#forum-191- 246. 247. #爬取想要的信息 248. bianhao=[]#存儲頁面編號 249. pageUrl=[]#存儲頁面連接 250. 251. templist1=bsObj.find("div",{"class":"pg"}) 252. #if templist1==None: 253. #return 254. for templist2 in templist1.findAll("a",href=re.compile("forum-([0-9]+)-([0-9]+).html")): 255. if templist2==None: 256. continue 257. lianjie=templist2.attrs['href'] 258. #print(lianjie) 259. index1=lianjie.rfind("-")#查找-在字符串中的位置 260. index2=lianjie.rfind(".")#查找.在字符串中的位置 261. tempbianhao=lianjie[index1+1:index2] 262. bianhao.append(int(tempbianhao)) 263. bianhaoMax=max(bianhao)#獲取頁面的最大編號 264. 265. for i in range(1,bianhaoMax+1): 266. temppageUrl=tempsiteurl+tempbianhaoqian+str(i)+".html"#組成頁面連接 267. print(temppageUrl) 268. pageUrl.append(temppageUrl) 269. return pageUrl#返回頁面連接列表 270. 271.#獲得當前版塊頁面全部帖子的連接 272.def GetCurrentPageTieziUrl(PageUrl): 273. #設置代理IP訪問 274. #代理IP能夠上http://http.zhimaruanjian.com/獲取 275. proxy_handler=urllib.request.ProxyHandler({'post':'110.73.30.157:8123'}) 276. proxy_auth_handler=urllib.request.ProxyBasicAuthHandler() 277. opener = urllib.request.build_opener(urllib.request.HTTPHandler, proxy_handler) 278. urllib.request.install_opener(opener) 279. 280. try: 281. #掉用第三方包selenium打開瀏覽器登錄 282. #driver=webdriver.Chrome()#打開chrome 283. driver=webdriver.Chrome()#打開無界面瀏覽器Chrome 284. #driver=webdriver.PhantomJS()#打開無界面瀏覽器PhantomJS 285. driver.set_page_load_timeout(10) 286. try: 287. driver.get(PageUrl)#登錄兩次 288. driver.get(PageUrl) 289. except TimeoutError: 290. driver.refresh() 291. 292. #print(driver.page_source) 293. html=driver.page_source#將瀏覽器執行後的源代碼賦給html 294. #獲取網頁信息 295. #抓捕網頁解析過程當中的錯誤 296. try: 297. #req=request.Request(tieziUrl,headers=headers5) 298. #html=urlopen(req) 299. bsObj=BeautifulSoup(html,"html.parser") 300. #html.close() 301. except UnicodeDecodeError as e: 302. print("-----UnicodeDecodeError url",PageUrl) 303. except urllib.error.URLError as e: 304. print("-----urlError url:",PageUrl) 305. except socket.timeout as e: 306. print("-----socket timout:",PageUrl) 307. 308. n=0 309. while(bsObj.find('title').get_text() == "頁面重載開啓"): 310. print("當前頁面不是重加載後的頁面,程序會嘗試刷新一次到跳轉後的頁面\n") 311. driver.get(PageUrl) 312. html=driver.page_source#將瀏覽器執行後的源代碼賦給html 313. bsObj=BeautifulSoup(html,"html.parser") 314. n=n+1 315. if n==10: 316. driver.close() # Close the current window. 317. driver.quit()#關閉chrome瀏覽器 318. return 1 319. 320. except Exception as e: 321. driver.close() # Close the current window. 322. driver.quit()#關閉chrome瀏覽器 323. time.sleep(1) 324. 325. driver.close() # Close the current window. 326. driver.quit()#關閉chrome瀏覽器 327. 328. 329. #http://bbs.baobeihuijia.com/forum-191-1.html變成http://bbs.baobeihuijia.com,以便組成帖子連接 330. siteindex=PageUrl.rfind("/") 331. tempsiteurl=PageUrl[0:siteindex+1]#http://bbs.baobeihuijia.com/ 332. #print(tempsiteurl) 333. TieziUrl=[] 334. #爬取想要的信息 335. for templist1 in bsObj.findAll("tbody",id=re.compile("normalthread_([0-9]+)")) : 336. if templist1==None: 337. continue 338. for templist2 in templist1.findAll("a",{"class":"s xst"}): 339. if templist2==None: 340. continue 341. tempteiziUrl=tempsiteurl+templist2.attrs['href']#組成帖子連接 342. print(tempteiziUrl) 343. TieziUrl.append(tempteiziUrl) 344. return TieziUrl#返回帖子連接列表 345. 346. 347. 348.#CurrentPageMissingPopulationInformation("http://bbs.baobeihuijia.com/thread-213126-1-1.html") 349.#GetALLPageUrl("http://bbs.baobeihuijia.com/forum-191-1.html") 350.#GetCurrentPageTieziUrl("http://bbs.baobeihuijia.com/forum-191-1.html") 351. 352.if __name__ == '__main__': 353. csvfile=open("E:/MissingPeople.csv","w+",newline="",encoding='gb18030') 354. writer=csv.writer(csvfile) 355. writer.writerow(('寶貝回家編號','姓名','性別','出生日期','失蹤時身高','失蹤時間','失蹤地點','是否報案')) 356. pageurl=GetALLPageUrl("https://bbs.baobeihuijia.com/forum-191-1.html")#尋找失蹤寶貝 357. #pageurl=GetALLPageUrl("http://bbs.baobeihuijia.com/forum-189-1.html")#被拐寶貝回家 358. time.sleep(5) 359. print("全部頁面連接獲取成功!\n") 360. n=0 361. for templist1 in pageurl: 362. #print(templist1) 363. tieziurl=GetCurrentPageTieziUrl(templist1) 364. time.sleep(5) 365. print("當前頁面"+str(templist1)+"全部帖子連接獲取成功!\n") 366. if tieziurl ==1: 367. print("不能獲得當前帖子頁面!\n") 368. continue 369. else: 370. for templist2 in tieziurl: 371. #print(templist2) 372. n=n+1 373. print("\n正在收集第"+str(n)+"條信息!") 374. time.sleep(5) 375. tempzhi=CurrentPageMissingPopulationInformation(templist2) 376. if tempzhi==1: 377. print("\n第"+str(n)+"條信息爲空!") 378. continue 379. print('') 380. print("信息爬取完成!請放心的關閉程序!") 381. csvfile.close()
寫成的CSV文件截圖: