一、实验目标
数据是分析的基础,由于没有经常合适的数据来源,因此希望做一些简单的爬虫程序,以实现对于所要分析领域数据的获取。
本文主要实现对于用益信托网产品页(http://www.yanglee.com/Product/Index.aspx) 下所有信托产品明细信息部分字段的自动爬取。
二、实验环境
(1)运行环境anaconda3+python3.6+PyCharm;
(2)安装Python爬虫库,启动Anaconda Prompt,输入以下命令:
pip install scrapy
pip install selenium
(3)安装基于chrome(本人使用chrome浏览器,可以根据自己浏览器安装不同的driver)的webdriver。
下载后复制到chrome安装目录下,并将chrome安装目录添加至path环境变量。
三、程序代码(截取主要部分):
1、设置Item中所要爬取的字段:
classTrustanaItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
#公司名称
companyName=scrapy.Field()
#产品名称
productName=scrapy.Field()
#发行日期
publishDate=scrapy.Field()
#最高收益
maxProfit=scrapy.Field()
#认购门槛
minCapital=scrapy.Field()
#期限
term=scrapy.Field()
#产品状态
productState=scrapy.Field()
#投资领域
investField=scrapy.Field()
#投资方式
investWay=scrapy.Field()
pass
2、 编程实现爬取程序:
classYangleeSpider(scrapy.Spider):
"""
功能:爬取信息
"""
name='yanglee'
def __init__(self):
super(YangleeSpider,self).__init__()
self.allowed_domains=['yanglee.com']
#起始url
self.start_urls=['http://www.yanglee.com/Product/Index.aspx']
option=webdriver.ChromeOptions()
option.add_argument('disable-infobars')
self.driver=webdriver.Chrome()
self.driver.set_page_load_timeout(15)# throw a TimeoutException when thepage load time is more than 5 seconds.
defparse(self,response):
url_set=set()#话题url的集合
ua=UserAgent()
self.driver.get(response.url)
while True:
time.sleep(2)#避免selenium报页面对象索引不到的异常
sel_list=self.driver.find_elements_by_xpath('//div[@class="recommend-product"]/a[@class="block"]')
url_list=[sel.get_attribute("href")forselinsel_list]
print(url_list)
url_set|=set(url_list)
try:
wait=WebDriverWait(self.driver,2)
wait.until(lambdadriver:driver.find_element_by_xpath(
'//ul[@class="pagination"]/li[@class="next"]/a'))#内容加载完成后爬取
next_page=self.driver.find_element_by_xpath('//ul[@class="pagination"]/li[@class="next"]/a')
next_page.click()#模拟点击下一页
except:
"#####Arrive thelast page.#####"
break
withopen('url_set.txt',mode='w')asf:
f.write(repr(url_set))
forurlinurl_set:
time.sleep(1)#防止被网站防爬机制阻止
yieldscrapy.Request(url,callback=self.parse_content)
defparse_content(self,response):
"""提取页面内容,通过pipeline存入指定字段
"""
item=TrustanaItem()
item['companyName']=response.xpath('//div[@class="tab-pane active"]/table[@class="maintab"]/tr[3]/td[2]/text()').extract()[]
item['productName']=response.xpath('//div[@class="tab-pane active"]/table[@class="maintab"]/tr[1]/td[2]/text()').extract()[]
item['publishDate']=response.xpath('//div[@class="tab-pane active"]/table[@class="maintab"]/tr[5]/td[2]/text()').extract()[]
item['maxProfit']=response.xpath('//div[@class="tab-pane active"]/table[@class="maintab"]/tr[8]/td[2]/text()').extract()[]
item['minCapital']=response.xpath('//div[@class="tab-pane active"]/table[@class="maintab"]/tr[3]/td[4]/text()').extract()[]
item['term']=response.xpath('//div[@class="tab-pane active"]/table[@class="maintab"]/tr[7]/td[2]/text()').extract()[]
item['productState']=response.xpath('//div[@class="tab-pane active"]/table[@class="maintab"]/tr[2]/td[4]/text()').extract()[]
item['investField']=response.xpath('//div[@class="tab-pane active"]/table[@class="maintab"]/tr[10]/td[2]/text()').extract()[]
item['investWay']=response.xpath('//div[@class="tab-pane active"]/table[@class="maintab"]/tr[9]/td[2]/text()').extract()[]
yielditem
3、编写pipeline存储爬取信息到Excel文件里
importjson
importopenpyxl
classTrustanaPipeline(object):
"""
功能:保存item数据
"""
def __init__(self):
self.wb=openpyxl.Workbook()
self.ws=self.wb.active
self.ws.append(['公司名称','产品名称','发行日期','预期收益','最低认购','期限','产品状态','投资领域','投资方式'])
defprocess_item(self,item,spider):
line=[item['companyName'],item['productName'],item['publishDate'],item['maxProfit'],item['minCapital'],item['term'],item['productState'],item['investField'],item['investWay']]
self.ws.append(line)
self.wb.save('test.xlsx')
returnitem
defclose_spider(self,spider):
四、爬取结果:
领取专属 10元无门槛券
私享最新 技术干货