前两天有人私信我,让我爬这个网站,http://bbs.baobeihuijia.com/forum-191-1.html上的失踪儿童信息,准备根据失踪儿童的失踪时的地理位置来更好的寻找失踪儿童,这种事情本就应该义不容辞,如果对网站服务器造成负荷,还请谅解。
这次依然是用第三方爬虫包BeautifulSoup,还有Selenium+Chrome,Selenium+PhantomJS来爬取信息。
通过分析网站的框架,依然分三步来进行。
步骤一:获取http://bbs.baobeihuijia.com/forum-191-1.html这个版块上的所有分页页面链接
步骤二:获取每一个分页链接上所发的帖子的链接
步骤三:获取每一个帖子链接上要爬取的信息,编号,姓名,性别,出生日期,失踪时身高,失踪时间,失踪地点,以及是否报案
起先用的BeautifulSoup,但是被管理员设置了网站重定向,然后就采用selenium的方式,在这里还是对网站管理员说一声抱歉。
1、获取http://bbs.baobeihuijia.com/forum-191-1.html这个版块上的所有分页页面链接
通过分析:发现分页的页面链接处于<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形式:
[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