Spider_Python 抓取:华尔街见闻

简介:   #!/usr/bin/env python  # -*- coding:utf-8 -*-  import sys  import re  import urllib, urllib2  import requests  import pymongo  import datetime

  #!/usr/bin/env python

  # -- coding:utf-8 --

  import sys

  import re

  import urllib, urllib2

  import requests

  import pymongo

  import datetime

  import multiprocessing as mp

  Category_Map={

  "1":u"外汇",

  "2":u"股市",

  "3":u"商品",

  "4":u"债市",

  "5":u"央行",

  "9":u"中国",

  "10":u"美国",

  "11":u"欧元区",

  "12":u"日本",

  "13":u"英国",

  "14":u"澳洲",

  "15":u"加拿大",

  "16":u"瑞士",

  "17":u"其他地区"

  }

  def num2name(category_num):

  if Category_Map.has_key(category_num):

  return Category_Map[category_num]

  else:

  return ""

  class MongoDBIO:

  # 申明相关的属性

  def __init__(self, host, port, name, password, database, collection):

  self=host

  self.port=port

  self.name=name

  self.password=password

  self.database=database

  self.collection=collection

  # 连接数据库,db和posts为数据库和集合的游标

  def Connection(self):

  # connection=pymongo.Connection() # 连接二手游戏账号卖号本地数据库

  connection=pymongo.Connection(host=self, port=self.port)

  # db=connection.datas

  db=connection[self.database]

  if self.name or self.password:

  db.authenticate(name=self.name, password=self.password) # 验证用户名密码

  # print "Database:", db.name

  # posts=db_live_news

  posts=db[self.collection]

  # print "Collection:", posts.name

  return posts

  # 保存操作

  def ResultSave(save_host, save_port, save_name, save_password, save_database, save_collection, save_content):

  posts=MongoDBIO(save_host, save_port, save_name, save_password, save_database, save_collection).Connection()

  posts.save(save_content)

  def Spider(url, data):

  # # 方法1:requests get

  content=requests.get(url=url, params=data).content # GET请求发送

  # # 方法2:urllib2 get

  # data=urllib.urlencode(data) # 编码工作,由dict转为string

  # full_url=url+'?'+data

  # print full_url

  # content=urllib2.urlopen(full_url).read() # GET请求发送

  # # content=requests.get(full_url).content # GET请求发送

  # print type(content) # str

  return content

  def ContentSave(item):

  # 保存配置

  save_host="localhost"

  save_port=27017

  save_name=""

  save_password=""

  save_database="textclassify"

  save_collection="WallstreetcnSave"

  source="wallstreetcn"

  createdtime=datetime.datetime.now()

  type=item[0]

  content=item[1].decode("unicode_escape") # json格式数据中,需从'?'形式的unicode_escape编码转换成u'?'的unicode编码

  content=content.encode("utf-8")

  # district的筛选

  categorySet=item[2]

  category_num=categorySet.split(",")

  category_name=map(num2name, category_num)

  districtset=set(category_name)&{u"中国", u"美国", u"欧元区", u"日本", u"英国", u"澳洲", u"加拿大", u"瑞士", u"其他地区"}

  district=",".join(districtset)

  propertyset=set(category_name)&{u"外汇", u"股市", u"商品", u"债市"}

  property=",".join(propertyset)

  centralbankset=set(category_name)&{u"央行"}

  centralbank=",".join(centralbankset)

  save_content={

  "source":source,

  "createdtime":createdtime,

  "content":content,

  "type":type,

  "district":district,

  "property":property,

  "centralbank":centralbank

  }

  ResultSave(save_host, save_port, save_name, save_password, save_database, save_collection, save_content)

  def func(page):

  url="api.wallstreetcn/v2/livenews"

  # get参数

  data={

  "page":page

  }

  content=Spider(url, data)

  items=re.findall(r'"type":"(.?)","codeType".?"contentHtml":"(.?)","data".?"categorySet":"(.*?)","hasMore"', content) # 正则匹配

  if len(items)==0:

  print "The End Page:", page

  data=urllib.urlencode(data) # 编码工作,由dict转为string

  full_url=url+'?'+data

  print full_url

  sys.exit(0) # 无错误退出

  else:

  print "The Page:", page, "Downloading..."

  for item in items:

  ContentSave(item)

  if __name__=='__main__':

  start=datetime.datetime.now()

  start_page=1

  end_page=3300

  # 多进程抓取

  pages=[i for i in range(start_page, end_page)]

  p=mp.Pool()

  p.map_async(func, pages)

  p.close()

  p.join()

  # 单进程抓取

  page=end_page

  while 1:

  url="api.wallstreetcn/v2/livenews"

  # get参数

  data={

  "page":page

  }

  content=Spider(url, data)

  items=re.findall(r'"type":"(.?)","codeType".?"contentHtml":"(.?)","data".?"categorySet":"(.*?)","hasMore"', content) # 正则匹配

  if len(items)==0:

  print "The End Page:", page

  data=urllib.urlencode(data) # 编码工作,由dict转为string

  full_url=url+'?'+data

  print full_url

  break

  else:

  print "The Page:", page, "Downloading..."

  for item in items:

  ContentSave(item)

  page +=1

  end=datetime.datetime.now()

  print "last time: ", end-start

目录
相关文章
|
4月前
|
数据采集 存储 JSON
地区电影市场分析:用Python爬虫抓取猫眼/灯塔专业版各地区票房
地区电影市场分析:用Python爬虫抓取猫眼/灯塔专业版各地区票房
|
7月前
|
数据采集 Web App开发 JavaScript
基于Selenium的Python爬虫抓取动态App图片
基于Selenium的Python爬虫抓取动态App图片
541 68
|
4月前
|
数据采集 存储 XML
Python爬虫XPath实战:电商商品ID的精准抓取策略
Python爬虫XPath实战:电商商品ID的精准抓取策略
|
7月前
|
数据采集 存储 前端开发
Python爬虫自动化:批量抓取网页中的A链接
Python爬虫自动化:批量抓取网页中的A链接
|
7月前
|
JSON API 数据格式
手把手教你抓取京东商品评论:API 接口解析与 Python 实战
京东商品评论蕴含用户对产品质量、体验和服务的真实反馈,分析这些数据有助于企业优化产品和满足用户需求。由于京东未提供官方API,需通过逆向工程获取评论数据。其主要接口为“商品评论列表接口”,支持按商品ID、评分、排序方式等参数获取评论,返回JSON格式数据,包含评论列表、摘要(如好评率)及热门标签等信息。
|
8月前
|
数据采集 存储 缓存
Python爬虫与代理IP:高效抓取数据的实战指南
在数据驱动的时代,网络爬虫是获取信息的重要工具。本文详解如何用Python结合代理IP抓取数据:从基础概念(爬虫原理与代理作用)到环境搭建(核心库与代理选择),再到实战步骤(单线程、多线程及Scrapy框架应用)。同时探讨反爬策略、数据处理与存储,并强调伦理与法律边界。最后分享性能优化技巧,助您高效抓取公开数据,实现技术与伦理的平衡。
421 4
|
8月前
|
数据采集 JSON API
Python 实战:用 API 接口批量抓取小红书笔记评论,解锁数据采集新姿势
小红书作为社交电商的重要平台,其笔记评论蕴含丰富市场洞察与用户反馈。本文介绍的小红书笔记评论API,可获取指定笔记的评论详情(如内容、点赞数等),支持分页与身份认证。开发者可通过HTTP请求提取数据,以JSON格式返回。附Python调用示例代码,帮助快速上手分析用户互动数据,优化品牌策略与用户体验。
1540 3
|
8月前
|
数据采集 存储 NoSQL
如何避免Python爬虫重复抓取相同页面?
如何避免Python爬虫重复抓取相同页面?
|
9月前
|
Web App开发 数据采集 前端开发
Python + Chrome 爬虫:如何抓取 AJAX 动态加载数据?
Python + Chrome 爬虫:如何抓取 AJAX 动态加载数据?
|
Python
"揭秘!Python如何运用神秘的正则表达式,轻松穿梭于网页迷宫,一键抓取隐藏链接?"
【8月更文挑战第21天】Python凭借其强大的编程能力,在数据抓取和网页解析领域表现出高效与灵活。通过结合requests库进行网页请求及正则表达式进行复杂文本模式匹配,可轻松提取网页信息。本示例展示如何使用Python和正则表达式解析网页链接。首先确保已安装requests库,可通过`pip install requests`安装。接着,利用requests获取网页内容,并使用正则表达式提取所有`<a>`标签的`href`属性。
229 0

推荐镜像

更多