前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >实战项目四:爬取911网站

实战项目四:爬取911网站

作者头像
K同学啊
发布2019-03-05 10:38:30
8790
发布2019-03-05 10:38:30
举报

这是我在英文取名项目中写的一份爬虫代码,今天将它整理一下分享给大家

需要爬取的东西

我爬取的是 https://myingwenming.911cha.com 网站,采集的是网站中的中文音译名字性别来源语种名字寓意名字印象名字含义6个数据。我分别设置namesChineseTransliterationnamesGendernamesFromLanguagenamesMoralnamesImpressionnamesMeaning等6个字段来存放相应的数据。

防反扒措施

在这防反扒这一块我选择每发送一次requests请求更换一个User-AgentIP。User-Agent的更换我依靠第三方库fake_useragent来完成,在每次发送requests请求前通过{'User-Agent':str(UserAgent().random)}语句来获取一个随机User-Agent。关于代理IP这块我则是事先准备好IP存放到IP.txt文件中,每一次发送requests前从该文件中随机获取一个IP用于本次请求。

代码语言:javascript
复制
def get_ip_list():
	'''
	读取IP.txt中的数据
	'''
	f=open('IP.txt','r')
	ip_list=f.readlines()
	f.close()
	return ip_list

def get_random_ip(ip_list):
	'''
	从IP列表中获取随机IP
	'''
	proxy_ip = random.choice(ip_list)
	proxy_ip=proxy_ip.strip('\n')
	proxies = {'http': proxy_ip}
	return proxies

关于网页解析

在网页解析这块我选择的是Python第三方库BeautifulSoup4,具体如何解析后期我再单独出一个教程吧,有不懂的地方可以在下方留言。

完整代码

代码语言:javascript
复制
from fake_useragent					import UserAgent
from bs4							import	BeautifulSoup
import pandas						as pd
import requests,csv,time,random

def get_ip_list():
	'''
	读取IP.txt中的数据
	'''
	f=open('IP.txt','r')
	ip_list=f.readlines()
	f.close()
	return ip_list

def get_random_ip(ip_list):
	'''
	从IP列表中获取随机IP
	'''
	proxy_ip = random.choice(ip_list)
	proxy_ip=proxy_ip.strip('\n')
	proxies = {'http': proxy_ip}
	return proxies

def parsePage(url,ip_list):
	'''
	爬取网页并返回所需信息以及状态码
	'''
	headers= {'User-Agent':str(UserAgent().random)}
	proxies = get_random_ip(ip_list)
	try:
		#verify设置为False,Requests也能忽略对SSL证书的验证。
		r = requests.get(url, proxies=proxies, headers=headers, timeout=10,verify=False)
	except:
		print('运行错误,程序暂停20秒')
		time.sleep(20)
		headers= {'User-Agent':str(UserAgent().random)}
		proxies = get_random_ip(ip_list)
		r = requests.get(url, proxies=proxies, headers=headers, timeout=10, verify=False)
	#状态码status_code为200代表爬取成功,为404则为未爬取到相关信息
	if r.status_code == 200:
		soup = BeautifulSoup(r.text, 'lxml')
		body = soup.find("div", class_="pp")
		contents = body.find_all('p')
		return r.status_code, contents
	else:
		return r.status_code, None

def getDict(contents):
	namesChineseTransliteration = []        #中文音译
	namesGender = []        #名字性别
	namesFromLanguage = []      #来源语种
	namesMoral = []         #名字寓意
	namesImpression = []        #名字印象
	namesMeaning = []           #名字含义

	namesChineseTransliteration.append(contents[1].get_text()[4:])
	namesGender.append(contents[-5].get_text()[4:])
	namesFromLanguage.append(contents[-4].get_text()[4:])
	namesMoral.append(contents[-3].get_text()[4:])  
	namesImpression.append(contents[-2].get_text()[4:])
	namesMeaning.append(contents[-1].get_text()[4:])
	str_row=namesChineseTransliteration+namesGender+namesFromLanguage+namesMoral+namesImpression+namesMeaning
 
	return str_row
 
def write_file(filePath, row):
	with open(filePath,'a+',encoding='utf-8',newline='') as csvfile:
		spanreader = csv.writer(csvfile,delimiter='|',quoting=csv.QUOTE_MINIMAL)
		spanreader.writerow(row)

if __name__ == "__main__":
	names = pd.read_csv("name_data.csv")['name']					#获取需要爬取文件的名字
	base_url = "https://myingwenming.911cha.com/"
	ip_list = get_ip_list()
	
	for name in names:
		url = base_url + name + ".html"

		status_code, contents = parsePage(url,ip_list)

		print("{}检索完成".format(name), "状态码为:{}".format(status_code))
		#状态码为200爬取成功,状态码为404爬取失败
		if status_code == 200:
			str_row = getDict(contents)
			row = ["{}".format(name)] + str_row
			write_file("new.csv",row)
		else:
			continue
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年02月02日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
SSL 证书
腾讯云 SSL 证书(SSL Certificates)为您提供 SSL 证书的申请、管理、部署等服务,为您提供一站式 HTTPS 解决方案。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档