首页
学习
活动
专区
工具
TVP
发布

使用scrapy和selenium实现动态网页的分页爬取

一、实验目标

数据是分析的基础,由于没有经常合适的数据来源,因此希望做一些简单的爬虫程序,以实现对于所要分析领域数据的获取。

本文主要实现对于用益信托网产品页(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:

print

"#####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):

四、爬取结果:

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180303G0R76800?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券