Python爬虫小实践:寻找失踪人口,爬取失踪儿童信息并写成csv文件,方便存入数据库

本文介绍了使用Python爬虫工具BeautifulSoup和Selenium,分三步爬取特定网站的失踪儿童信息,包括获取分页链接、帖子链接以及详细信息,并将数据写入CSV文件,以便后续分析和存入数据库。注意,爬取过程中需尊重网站规则,避免对服务器造成过大负担。
摘要由CSDN通过智能技术生成

前两天有人私信我,让我爬这个网站,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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值