预告:详细数据分析和代码在文末,希望能够把这份数据扩散出去,真正帮助那些丢失孩子的家庭。
事情的开始是这样的,前几天看到群里有朋友分享尧大的研究,用到了人口拐卖数据。我其实这两年都在关注这个话题,目前大部分人口拐卖是用的宝贝回家网的数据,我恰好有一份更高质量的全国尺度的包含妇女贩卖,人口贩卖,等不单单是婴幼儿拐卖的数据,想做点大尺度的综合类的研究分析,所以就在群里提到了这个。大家听说有这里有大傻子来用爱发电爬数据,脸上纷纷漏出了白嫖的喜悦,纷纷回应。
我耳根子比较软,在群友的一声声轻声细语中很快败下阵来,承诺将会提供一份数据出来,也就是大家用的很广的“宝贝回家”数据,这份数据大家做简单分析应该是够了。如果想分析的更深入细致,可以一起做更高质量的其他来源的数据哦。宝贝回家的数据18年武大资环的一位老师就用来做了研究,并发在了nature sustainability上,被编辑选为feature study(亮点研究)。
其实方法再简单不过了,就是把发布地点和被拐地点做个OD,然后复杂网络一套就完事了,如下图。
这套数据链接是:www.baobeihuijia.com/bbhj,相当多的寻亲信息。
随便点进去一个,看到详细的寻亲信息。每一条都是血淋漓的家庭悲剧,可恶的人贩子啊。
其实数据都是公开的抓取非常简单,我花了一个小时写了以下代码,递增页面的索引,最多1147页,平均每页50个孩子,登记了约5万名被拐儿童信息,而真实的被拐数字恐怕是十倍不止。
随机提取部分数据进行简单的数据统计,可以看到其实相当一部分儿童不是拐卖而是送出去了,现在原生父母想要重新找到,哎,早知如此何必当初呢?
看下男女比例,再次哑然。
被拐的孩子出生日期以及被拐时间主要集中在1990年。这种情况新世纪后才得以好转,小时候大人说不要乱跑,容易被人贩子拐走所言非虚啊。
大家回复宝贝回家获取数据,附上数据爬取的代码,仅供学习,不要自己一直开爬虫防止对服务器干扰,影响那些真正需要想找回孩子的人:
import requests
from bs4 import BeautifulSoup
import csv
def extract_person_info(person_div):
href = person_div.find('a', target='_blank')['href']
img_src = person_div.find('img', class_='img-fluid')['src']
label = person_div.find('span', class_='badge').get_text()
agent_info = person_div.find('div', class_='person-agent-info')
agent_name = agent_info.find('a')['href']
registration_date = agent_info.find('span', class_='d-block').get_text()
return {
'href': href,
'img_src': img_src,
'label': label,
'agent_name': agent_name,
'registration_date': registration_date
}
def extract_registration_info(soup):
registration_info = soup.find('div', class_='pagecontent')
if registration_info:
registration_data = {}
for item in registration_info.find_all('li'):
key = item.find('div', class_='view-th').text.strip()
value = item.find('div', class_='view-td').text.strip()
# Correcting the format for "失踪地点" field
if '失踪地点' in key:
value = key.split(':')[-1]
key = '失踪地点:'
registration_data[key] = value
return registration_data
else:
print("Registration information not found.")
return None
def scrape_page(page_number):
url = f'https://www.baobeihuijia.com/bbhj/channels/3_{page_number}.html'
html_content = requests.get(url).content.decode('utf-8')
soup = BeautifulSoup(html_content, 'html.parser')
person_divs = soup.find_all('div', class_='person-image')
for person_div in person_divs:
person_info = extract_person_info(person_div)
result_url = 'https://www.baobeihuijia.com' + person_info['href']
result_html_content = requests.get(result_url).content.decode('utf-8')
result_soup = BeautifulSoup(result_html_content, 'html.parser')
registration_data = extract_registration_info(result_soup)
if registration_data:
with open('宝贝回家3.csv', 'a', encoding='utf-8', newline='') as f:
csv_writer = csv.writer(f)
csv_writer.writerow(registration_data.values())
with open('宝贝回家3.csv', 'w', encoding='utf-8', newline='') as f:
f.write("Title,寻亲类别:,失踪类型:,寻亲编号:,姓名:,性别:,出生日期:,失踪时身高:,失踪时间:,失踪地点,失踪者特征描述:,其他资料:,注册时间:,跟进志愿者:")
f.write("\n")
# Iterate over pages from 2 to 5
for page_number in range(2, 200):
scrape_page(page_number)
其实除了儿童拐卖外,妇女贩卖也是非常严重的事情,我们使用另外的数据源,绘制了中国妇女拐卖多发的城市,其中与缅甸越南的边界是高发区域。大家如果感兴趣可以一起完成这个工作。