前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python3--baby网的数据爬取

Python3--baby网的数据爬取

作者头像
K同学啊
发布2019-01-22 15:15:32
3680
发布2019-01-22 15:15:32
举报

上代码:

代码语言:javascript
复制
'''
本代码用来爬取https://www.babyment.com/yingwenming/kaitou.php?start_letter=A&page=1的信息
'''

import requests,csv,time,random
from bs4 import BeautifulSoup
from fake_useragent import UserAgent

#获取ip列表
def get_ip_list():    
    f=open('IP.txt','r')    
    ip_list=f.readlines()    
    f.close()    
    return ip_list    
    
#从IP列表中获取随机IP    
def get_random_ip(ip_list):    
    proxy_ip = random.choice(ip_list)    
    proxy_ip=proxy_ip.strip('\n')    
    proxies = {'http': proxy_ip}    
    return proxies 

#功能:将信息写入文件    
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) 

#解析baby网
def get_EnNames_list(url,ip_list):
	print('输入进来的url为:{}'.format(url))

	#获取随机IP,headers防止ip被封
	headers = {'User-Agent':str(UserAgent().random)}
	proxies = get_random_ip(ip_list)

	try:
		req = requests.get(url=url,headers=headers,proxies=proxies,timeout=10)
	except:
		print('运行出错10秒后重新运行')
		time.sleep(10)
		headers = {'User-Agent':str(UserAgent().random)}
		proxies = get_random_ip(ip_list)
		req = requests.get(url=url,headers=headers,proxies=proxies,timeout=10)

	#在利用find_all()注意要准确定位
	soup = BeautifulSoup(req.text,'lxml')
	content = soup.find('table',class_='table')
	content = content.find('tbody')
	content = content.find_all('tr')
	name = []
	#列表中没有find_all()方法,故需要利用for语句
	for each in content:
		name.append(each.find_all('b')[0].get_text())
	return name


#获取baby网中所有的的英文名
def get_EnNames(letter,ip_list):
	for number in range(1,100):
		url = 'https://www.babyment.com/yingwenming/kaitou.php?start_letter={}&page={}'.format(letter,number)
		#一个网页一个网页的获取我们需要的英文名
		name = get_EnNames_list(url,ip_list)
		#当page遇到最大值时,name就会为空,我们利用这一点进行切换,进入下一个字母的爬取
		if not name:
			print('{}开头的英文名共{}个'.format(letter,number-1))
			break
		for each in name:
			#将一个列表分为多个列表,从而实现换行
			a=[]
			a.append(each)
			write_file('A-Z.csv',a)

if __name__ == "__main__":
	ip_list = get_ip_list()
	for letter in 'ABCDEFGHIJKLMNOPQRSTUVWXYZ':
		get_EnNames(letter,ip_list)
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年04月11日,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档