为了学习机器学习深度学习和文本挖掘方面的知识,需要获取一定的数据,新浪微博的大量数据可以作为此次研究历程的对象
一、环境准备
python 2.7
scrapy框架的部署(可以查看上一篇博客的简要操作,传送门:点击打开链接)
mysql的部署(需要的资源百度网盘链接:点击打开链接)
heidiSQL数据库可视化
本人的系统环境是 win 64位的 所以以上环境都是需要兼容64位的
二、scrapy组件和数据流介绍
1、Scrapy architecture
组件Scrapy Engine
引擎负责控制数据流在系统中所有组件中流动,并在相应动作发生时触发事件。
调度器(Scheduler)
调度器从引擎接受request并将他们入队,以便之后引擎请求他们时提供给引擎。
下载器(Downloader)
下载器负责获取页面数据并提供给引擎,而后提供给spider。
Spiders
Spider是Scrapy用户编写用于分析response并提取item(即获取到的item)或额外跟进的URL的类。 每个spider负责处理一个特定(或一些)网站。Item PipelineItem Pipeline负责处理被spider提取出来的item。典型的处理有清理、 验证及持久化(例如存取到数据库中)。
下载器中间件(Downloader middlewares)
下载器中间件是在引擎及下载器之间的特定钩子(specific hook),处理Downloader传递给引擎的response。 其提供了一个简便的机制,通过插入自定义代码来扩展Scrapy功能。更多内容请看 下载器中间件(Downloader Middleware) 。
Spider中间件(Spider middlewares)
Spider中间件是在引擎及Spider之间的特定钩子(specific hook),处理spider的输入(response)和输出(items及requests)。 其提供了一个简便的机制,通过插入自定义代码来扩展Scrapy功能。更多内容请看 Spider中间件(Middleware) 。
2、数据流(Data flow)
Scrapy中的数据流由执行引擎控制,其过程如下:
1.引擎打开一个网站(open a domain),找到处理该网站的Spider并向该spider请求第一个要爬取的URL(s)。
2.引擎从Spider中获取到第一个要爬取的URL并在调度器(Scheduler)以Request调度。
3.引擎向调度器请求下一个要爬取的URL。
4.调度器返回下一个要爬取的URL给引擎,引擎将URL通过下载中间件(请求(request)方向)转发给下载器(Downloader)。
5.一旦页面下载完毕,下载器生成一个该页面的Response,并将其通过下载中间件(返回(response)方向)发送给引擎。
6.引擎从下载器中接收到Response并通过Spider中间件(输入方向)发送给Spider处理。
7.Spider处理Response并返回爬取到的Item及(跟进的)新的Request给引擎。
8.引擎将(Spider返回的)爬取到的Item给Item Pipeline,将(Spider返回的)Request给调度器。
9.(从第二步)重复直到调度器中没有更多地request,引擎关闭该网站。
以上组件和数据流的部分是参考别的的介绍,觉得描述的挺好,比较容易理解整个框架的结构。下面是干货:
三、scrapy工程对象
在你需要创建工程的目录底下启动cmd命令(按住shift键右键选择在此处打开命令窗口) 执行:scrapy startproject weibo
会在当前目录下生成scrapy框架的目录结构:
本人用的IDE是pycharm ,用IDE打开工程,工程最终的目录结构如图所示:
1、item.py的内容:
# encoding=utf-8
from scrapy.item import Item, Field
class InformationItem(Item):
#关注对象的相关个人信息
_id = Field() # 用户ID
Info = Field() # 用户基本信息
Num_Tweets = Field() # 微博数
Num_Follows = Field() # 关注数
Num_Fans = Field() # 粉丝数
HomePage = Field() #关注者的主页
class TweetsItem(Item):
#微博内容的相关信息
_id = Field() # 用户ID
Content = Field() # 微博内容
Time_Location = Field() # 时间地点
Pic_Url = Field() # 原图链接
Like = Field() # 点赞数
Transfer = Field() # 转载数
Comment = Field() # 评论数
定义了两个类,InformationItem获取关注列表用户的个人信息,TweetsItem获取微博内容
2、weibo_spider.py的内容:
# coding=utf-8
from scrapy.spider import Spider
from scrapy.http import Request
from scrapy.selector import Selector
from weibo.items import InformationItem,TweetsItem
import re
import requests
from bs4 import BeautifulSoup
class Weibo(Spider):
name = "weibospider"
redis_key = 'weibospider:start_urls'
#可以从多个用户的关注列表中获取这些用户的关注对象信息和关注对象的微博信息
start_urls = ['http://weibo.cn/0123456789/follow','http://weibo.cn/0123456789/follow']
#如果通过用户的分组获取关注列表进行抓取数据,需要调整parse中如id和nextlink的多个参数
#strat_urls = ['http://weibo.cn/attgroup/show?cat=user¤tPage=2&rl=3&next_cursor=20&previous_cursor=10&type=opening&uid=1771329897&gid=201104290187632788&page=1']
url = 'http://weibo.cn'
#group_url = 'http://weibo.cn/attgroup/show'
#把已经获取过的用户ID提前加入Follow_ID中避免重复抓取
Follow_ID = ['0123456789']
TweetsID = []
def parse(self,response):
#用户关注者信息
informationItems = InformationItem()
selector = Selector(response)
print selector
Followlist = selector.xpath('//tr/td[2]/a[2]/@href').extract()
print "输出关注人ID信息"
print len(Followlist)
for each in Followlist:
#选取href字符串中的id信息
followId = each[(each.index("uid")+4)