为了学习机器学习深度学习和文本挖掘方面的知识,需要获取一定的数据,新浪微博的大量数据可以作为此次研究历程的对象

一、环境准备

 
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的内容:

  1. # encoding=utf-8
  2. from scrapy.item import Item, Field
  3. class InformationItem(Item):
  4. #关注对象的相关个人信息
  5. _id = Field()  # 用户ID
  6. Info = Field() # 用户基本信息
  7. Num_Tweets = Field()  # 微博数
  8. Num_Follows = Field()  # 关注数
  9. Num_Fans = Field()  # 粉丝数
  10. HomePage = Field() #关注者的主页
  11. class TweetsItem(Item):
  12. #微博内容的相关信息
  13. _id = Field()  # 用户ID
  14. Content = Field()  # 微博内容
  15. Time_Location = Field()  # 时间地点
  16. Pic_Url = Field()  # 原图链接
  17. Like = Field()  # 点赞数
  18. Transfer = Field()  # 转载数
  19. Comment = Field()  # 评论数

定义了两个类,InformationItem获取关注列表用户的个人信息,TweetsItem获取微博内容

2、weibo_spider.py的内容:

  1. # coding=utf-8
  2. from scrapy.spider import Spider
  3. from scrapy.http import Request
  4. from scrapy.selector import Selector
  5. from weibo.items import InformationItem,TweetsItem
  6. import re
  7. import requests
  8. from bs4 import BeautifulSoup
  9. class Weibo(Spider):
  10. name = "weibospider"
  11. redis_key = 'weibospider:start_urls'
  12. #可以从多个用户的关注列表中获取这些用户的关注对象信息和关注对象的微博信息
  13. start_urls = ['http://weibo.cn/0123456789/follow','http://weibo.cn/0123456789/follow']
  14. #如果通过用户的分组获取关注列表进行抓取数据,需要调整parse中如id和nextlink的多个参数
  15. #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']
  16. url = 'http://weibo.cn'
  17. #group_url = 'http://weibo.cn/attgroup/show'
  18. #把已经获取过的用户ID提前加入Follow_ID中避免重复抓取
  19. Follow_ID = ['0123456789']
  20. TweetsID = []
  21. def parse(self,response):
  22. #用户关注者信息
  23. informationItems = InformationItem()
  24. selector = Selector(response)
  25. print selector
  26. Followlist = selector.xpath('//tr/td[2]/a[2]/@href').extract()
  27. print "输出关注人ID信息"
  28. print len(Followlist)
  29. for each in Followlist:
  30. #选取href字符串中的id信息
  31. followId = each[(each.index("uid")+4):(each.index("rl")-1)]
  32. print followId
  33. follow_url = "http://weibo.cn/%s" % followId
  34. #通过筛选条件获取需要的微博信息,此处为筛选原创带图的微博
  35. needed_url = "http://weibo.cn/%s/profile?hasori=1&haspic=1&endtime=20160822&advancedfilter=1&page=1" % followId
  36. print follow_url
  37. print needed_url
  38. #抓取过数据的用户不再抓取:
  39. while followId not in self.Follow_ID:
  40. yield Request(url=follow_url, meta={"item": informationItems, "ID": followId, "URL": follow_url}, callback=self.parse1)
  41. yield Request(url=needed_url, callback=self.parse2)
  42. self.Follow_ID.append(followId)
  43. nextLink = selector.xpath('//div[@class="pa"]/form/div/a/@href').extract()
  44. #查找下一页,有则循环
  45. if nextLink:
  46. nextLink = nextLink[0]
  47. print nextLink
  48. yield Request(self.url + nextLink, callback=self.parse)
  49. else:
  50. #没有下一页即获取完关注人列表之后输出列表的全部ID
  51. print self.Follow_ID
  52. #yield informationItems
  53. def parse1(self, response):
  54. """ 通过ID访问关注者信息 """
  55. #通过meta把parse中的对象变量传递过来
  56. informationItems = response.meta["item"]
  57. informationItems['_id'] = response.meta["ID"]
  58. informationItems['HomePage'] = response.meta["URL"]
  59. selector = Selector(response)
  60. #info = ";".join(selector.xpath('//div[@class="ut"]/text()').extract())  # 获取标签里的所有text()
  61. info = selector.xpath('//div[@class="ut"]/span[@class="ctt"]/text()').extract()
  62. #用/分开把列表中的各个元素便于区别不同的信息
  63. allinfo = '  /  '.join(info)
  64. try:
  65. #exceptions.TypeError: expected string or buffer
  66. informationItems['Info'] = allinfo
  67. except:
  68. pass
  69. #text2 = selector.xpath('body/div[@class="u"]/div[@class="tip2"]').extract()
  70. num_tweets = selector.xpath('body/div[@class="u"]/div[@class="tip2"]/span/text()').extract()  # 微博数
  71. num_follows = selector.xpath('body/div[@class="u"]/div[@class="tip2"]/a[1]/text()').extract()  # 关注数
  72. num_fans = selector.xpath('body/div[@class="u"]/div[@class="tip2"]/a[2]/text()').extract()  # 粉丝数
  73. #选取'[' ']'之间的内容
  74. if num_tweets:
  75. informationItems["Num_Tweets"] = (num_tweets[0])[((num_tweets[0]).index("[")+1):((num_tweets[0]).index("]"))]
  76. if num_follows:
  77. informationItems["Num_Follows"] = (num_follows[0])[((num_follows[0]).index("[")+1):((num_follows[0]).index("]"))]
  78. if num_fans:
  79. informationItems["Num_Fans"] = (num_fans[0])[((num_fans[0]).index("[")+1):((num_fans[0]).index("]"))]
  80. yield informationItems
  81. #获取关注人的微博内容相关信息
  82. def parse2(self, response):
  83. selector = Selector(response)
  84. tweetitems = TweetsItem()
  85. #可以直接用request的meta传递ID过来更方便
  86. IDhref = selector.xpath('//div[@class="u"]/div[@class="tip2"]/a[1]/@href').extract()
  87. ID = (IDhref[0])[1:11]
  88. Tweets = selector.xpath('//div[@class="c"]')
  89. # 跟parse1稍有不同,通过for循环寻找需要的对象
  90. for eachtweet in Tweets:
  91. #获取每条微博唯一id标识
  92. mark_id = eachtweet.xpath('@id').extract()
  93. print mark_id
  94. #当id不为空的时候加入到微博获取列表
  95. if mark_id:
  96. #去重操作,对于已经获取过的微博不再获取
  97. while mark_id not in self.TweetsID:
  98. content = eachtweet.xpath('div/span[@class="ctt"]/text()').extract()
  99. timelocation = eachtweet.xpath('div[2]/span[@class="ct"]/text()').extract()
  100. pic_url = eachtweet.xpath('div[2]/a[2]/@href').extract()
  101. like = eachtweet.xpath('div[2]/a[3]/text()').extract()
  102. transfer = eachtweet.xpath('div[2]/a[4]/text()').extract()
  103. comment = eachtweet.xpath('div[2]/a[5]/text()').extract()
  104. tweetitems['_id'] = ID
  105. #把列表元素连接且转存成字符串
  106. allcontents = ''.join(content)
  107. #内容可能为空 需要先判定
  108. if allcontents:
  109. tweetitems['Content'] = allcontents
  110. else:
  111. pass
  112. if timelocation:
  113. tweetitems['Time_Location'] = timelocation[0]
  114. if pic_url:
  115. tweetitems['Pic_Url'] = pic_url[0]
  116. # 返回字符串中'[' ']'里的内容
  117. if like:
  118. tweetitems['Like'] = (like[0])[((like[0]).index("[")+1):((like[0]).index("]"))]
  119. if transfer:
  120. tweetitems['Transfer'] = (transfer[0])[((transfer[0]).index("[")+1):((transfer[0]).index("]"))]
  121. if comment:
  122. tweetitems['Comment'] = (comment[0])[((comment[0]).index("[")+1):((comment[0]).index("]"))]
  123. #把已经抓取过的微博id存入列表
  124. self.TweetsID.append(mark_id)
  125. yield tweetitems
  126. else:
  127. #如果selector语句找不到id 查看当前查询语句的状态
  128. print eachtweet
  129. tweet_nextLink = selector.xpath('//div[@class="pa"]/form/div/a/@href').extract()
  130. if tweet_nextLink:
  131. tweet_nextLink = tweet_nextLink[0]
  132. print tweet_nextLink
  133. yield Request(self.url + tweet_nextLink, callback=self.parse2)

每个微博用户都有唯一的标识uid,此uid是获取需要对象的关键。修改start_url里面的ID(0123456789),比如换成留几手的ID(1761179351),即把地址换成你想获取的用户的关注人列表的信息,可以对多个用户的关注列表用redis_keyf方式进行分布式操作。内容比较多就不一一介绍,代码不理解的可以留言探讨,本人也是模仿着别人的框架写出来的代码,不是科班出身,代码写的比较渣渣,大神可以帮忙指点一二。

 

3、获取cookies模拟登陆微博:

  1. # encoding=utf-8
  2. import requests
  3. from selenium import webdriver
  4. import time
  5. from PIL import Image
  6. import urllib2
  7. from bs4 import BeautifulSoup
  8. import re
  9. import urllib
  10. #多点账号防止被和谐
  11. myAccount = [
  12. {'no': 'XXXXXXXXXX', 'psw': 'XXXXXXXXX'},
  13. {'no': 'XXXXXXXX', 'psw': 'XXXXXXX'},
  14. {'no': 'XXXXXX', 'psw': 'XXXXXXX'}
  15. ]
  16. headers={
  17. "Host":"login.weibo.cn",
  18. "User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0",
  19. "Accept":'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
  20. "Accept-Language":"zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3",
  21. "Accept-Encoding":"gzip, deflate",
  22. "Connection":"keep-alive"
  23. }
  24. # 获取验证码等相关登录信息
  25. def get_captchainfo(loginURL):
  26. html = requests.get(loginURL).content
  27. bs = BeautifulSoup(html)
  28. #print bs
  29. #注意通过bs.select元素寻找对象,返回的是列表对象
  30. password_name = (bs.select('input[type="password"]'))[0].get('name')
  31. vk = (bs.select('input[name="vk"]'))[0].get('value')
  32. capId = (bs.select('input[name="capId"]'))[0].get('value')
  33. print password_name,vk,capId
  34. try:
  35. captcha_img = bs.find("img", src=re.compile('http://weibo.cn/interface/f/ttt/captcha/')).get('src')
  36. print captcha_img
  37. #captchaid可以从验证码图片地址中直接截取获得
  38. urllib.urlretrieve(captcha_img, 'captcha.jpg')
  39. print "captcha download success!"
  40. captcha_input = input("please input the captcha\n>")
  41. except:
  42. return None
  43. return (captcha_input,password_name,vk,capId)
  44. def getCookies(weibo):
  45. """ 获取Cookies """
  46. cookies = []
  47. loginURL = 'http://login.weibo.cn/login/'
  48. for elem in weibo:
  49. account = elem['no']
  50. password = elem['psw']
  51. captcha = get_captchainfo(loginURL)
  52. if captcha[0] is None:
  53. #不需要验证码时的表单,微博移动网页版都要验证码,此处可以忽略
  54. postData = {
  55. "source": "None",
  56. "redir": "http://weibo.cn/",
  57. "mobile": account,
  58. "password": password,
  59. "login": "登录",
  60. }
  61. else:
  62. #需要验证码时的表单
  63. print "提交表单数据"
  64. postData = {
  65. "mobile": account,
  66. captcha[1]: password,
  67. "code": captcha[0],
  68. "remember":"on",
  69. "backurl": "http://weibo.cn/",
  70. "backtitle":u'微博',
  71. "tryCount":"",
  72. "vk": captcha[2],
  73. "capId": captcha[3],
  74. "submit": u'登录',
  75. }
  76. print postData
  77. session = requests.Session()
  78. r = session.post(loginURL, data=postData, headers=headers)
  79. #判断post过后是否跳转页面
  80. #time.sleep(2)
  81. print r.url
  82. if r.url == 'http://weibo.cn/?PHPSESSID=&vt=1'or 'http://weibo.cn/?PHPSESSID=&vt=4':
  83. ceshihtml = requests.get(r.url).content
  84. print ceshihtml
  85. print 'Login successfully!!!'
  86. cookie = session.cookies.get_dict()
  87. cookies.append(cookie)
  88. else:
  89. print "login failed!"
  90. return cookies
  91. '''''
  92. #通过selenium driver方式获取cookie
  93. def getcookieByDriver(weibo):
  94. driver = webdriver.Firefox()
  95. driver.maximize_window()
  96. cookies = []
  97. for elem in weibo:
  98. account = elem['no']
  99. password = elem['psw']
  100. driver.get("http://login.weibo.cn/login/")
  101. elem_user = driver.find_element_by_name("mobile")
  102. elem_user.send_keys(account)  # 用户名
  103. #微博的password有加后缀,
  104. elem_pwd = driver.find_element_by_name("password_XXXX")
  105. elem_pwd.send_keys(password)  # 密码
  106. time.sleep(10)
  107. #手动输验证码时间
  108. elem_sub = driver.find_element_by_name("submit")
  109. elem_sub.click()  # 点击登陆
  110. time.sleep(2)
  111. weibo_cookies = driver.get_cookies()
  112. #cookie = [item["name"] + "=" + item["value"] for item in douban_cookies]
  113. #cookiestr = '; '.join(item for item in cookie)
  114. cookies.append(weibo_cookies)
  115. return cookies
  116. '''
  117. cookies = getCookies(myAccount)
  118. #cookies = getcookieByDriver(myAccount)
  119. print "Get Cookies Finish!( Num:%d)" % len(cookies)

在myAcount中输入你自己拥有的微博账号密码,就可以模拟登陆微博啦:

这里有两种方式:
【1】模拟浏览器提交表单登陆(推荐)
【2】通过selenium WebDriver 方式登陆
验证码暂时还是先手动输一下吧,还没有找到快速有效的方式破解。
反正只要拿到cookie保存下来就可以进行抓取操作啦。
 

4、数据管道pipeline存入MySQL数据库:

  1. # -*- coding: utf-8 -*-
  2. import MySQLdb
  3. from items import InformationItem,TweetsItem
  4. DEBUG = True
  5. if DEBUG:
  6. dbuser = 'root'
  7. dbpass = '123456'
  8. dbname = 'tweetinfo'
  9. dbhost = '127.0.0.1'
  10. dbport = '3306'
  11. else:
  12. dbuser = 'XXXXXXXX'
  13. dbpass = 'XXXXXXX'
  14. dbname = 'tweetinfo'
  15. dbhost = '127.0.0.1'
  16. dbport = '3306'
  17. class MySQLStorePipeline(object):
  18. def __init__(self):
  19. self.conn = MySQLdb.connect(user=dbuser, passwd=dbpass, db=dbname, host=dbhost, charset="utf8",
  20. use_unicode=True)
  21. self.cursor = self.conn.cursor()
  22. #建立需要存储数据的表
  23. # 清空表(测试阶段):
  24. self.cursor.execute("truncate table followinfo;")
  25. self.conn.commit()
  26. self.cursor.execute("truncate table tweets;")
  27. self.conn.commit()
  28. def process_item(self, item, spider):
  29. #curTime = datetime.datetime.now()
  30. if isinstance(item, InformationItem):
  31. print "开始写入关注者信息"
  32. try:
  33. self.cursor.execute("""INSERT INTO followinfo (id, Info, Num_Tweets, Num_Follows, Num_Fans, HomePage)
  34. VALUES (%s, %s, %s, %s, %s, %s)""",
  35. (
  36. item['_id'].encode('utf-8'),
  37. item['Info'].encode('utf-8'),
  38. item['Num_Tweets'].encode('utf-8'),
  39. item['Num_Follows'].encode('utf-8'),
  40. item['Num_Fans'].encode('utf-8'),
  41. item['HomePage'].encode('utf-8'),
  42. )
  43. )
  44. self.conn.commit()
  45. except MySQLdb.Error, e:
  46. print "Error %d: %s" % (e.args[0], e.args[1])
  47. elif isinstance(item, TweetsItem):
  48. print "开始写入微博信息"
  49. try:
  50. self.cursor.execute("""INSERT INTO tweets (id, Contents, Time_Location, Pic_Url, Zan, Transfer, Comment)
  51. VALUES (%s, %s, %s, %s, %s, %s, %s)""",
  52. (
  53. item['_id'].encode('utf-8'),
  54. item['Content'].encode('utf-8'),
  55. item['Time_Location'].encode('utf-8'),
  56. item['Pic_Url'].encode('utf-8'),
  57. item['Like'].encode('utf-8'),
  58. item['Transfer'].encode('utf-8'),
  59. item['Comment'].encode('utf-8')
  60. )
  61. )
  62. self.conn.commit()
  63. except MySQLdb.Error, e:
  64. print "出现错误"
  65. print "Error %d: %s" % (e.args[0], e.args[1])
  66. return item

MySQL部署好之后只要输入自己的用户名密码就可以存到数据库当中去

因为我的创建表格没有写到pipeline中,就先自己建好数据库和表格好了:
需要注意的是:为了让mysql正常显示中文,在建立数据库的时候使用如下语句:

  1. CREATE DATABASE tweetinfo DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
数据库目录结构:
 
 
创建 表格followinfo
  1. CREATE TABLE `followinfo` (
  2. `No` INT(11) NOT NULL AUTO_INCREMENT,
  3. `id` VARCHAR(50) NULL DEFAULT NULL,
  4. `Info` VARCHAR(100) NOT NULL,
  5. `Num_Tweets` INT(10) NOT NULL,
  6. `Num_Follows` INT(10) NOT NULL,
  7. `Num_Fans` INT(10) NOT NULL,
  8. `HomePage` VARCHAR(50) NOT NULL,
  9. PRIMARY KEY (`No`)
  10. )
  11. COLLATE='utf8_general_ci'
  12. ENGINE=MyISAM
  13. AUTO_INCREMENT=5
  14. ;

创建表格tweets

  1. CREATE TABLE `tweets` (
  2. `No` INT(11) NOT NULL AUTO_INCREMENT,
  3. `id` VARCHAR(20) NOT NULL,
  4. `Contents` VARCHAR(300) NULL DEFAULT NULL,
  5. `Time_Location` VARCHAR(50) NOT NULL,
  6. `Pic_Url` VARCHAR(100) NULL DEFAULT NULL,
  7. `Zan` INT(10) NOT NULL,
  8. `Transfer` INT(10) NOT NULL,
  9. `Comment` INT(10) NOT NULL,
  10. PRIMARY KEY (`No`)
  11. )
  12. COLLATE='utf8_general_ci'
  13. ENGINE=MyISAM
  14. AUTO_INCREMENT=944
  15. ;

5、中间组建middleware:

  1. # encoding=utf-8
  2. import random
  3. from cookies import cookies
  4. from user_agents import agents
  5. class UserAgentMiddleware(object):
  6. """ 换User-Agent """
  7. def process_request(self, request, spider):
  8. agent = random.choice(agents)
  9. request.headers["User-Agent"] = agent
  10. class CookiesMiddleware(object):
  11. """ 换Cookie """
  12. def process_request(self, request, spider):
  13. cookie = random.choice(cookies)
  14. request.cookies = cookie

 

6、设置相关settings:

  1. # coding=utf-8
  2. BOT_NAME = 'weibo'
  3. SPIDER_MODULES = ['weibo.spiders']
  4. NEWSPIDER_MODULE = 'weibo.spiders'
  5. USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.54 Safari/536.5'
  6. '''''
  7. #把数据存到路径中的CSV文件中去
  8. FEED_URI = u'file:///G:/MovieData/followinfo.csv'
  9. FEED_FORMAT = 'CSV'
  10. '''
  11. DOWNLOADER_MIDDLEWARES = {
  12. "weibo.middleware.UserAgentMiddleware": 401,
  13. "weibo.middleware.CookiesMiddleware": 402,
  14. }
  15. ITEM_PIPELINES = {
  16. #'weather2.pipelines.Weather2Pipeline': 300,
  17. 'weibo.pipelines.MySQLStorePipeline': 300,
  18. }
  19. DOWNLOAD_DELAY = 2  # 下载器间隔时间
  20. # Crawl responsibly by identifying yourself (and your website) on the user-agent
  21. #USER_AGENT = 'doubanmovie (+http://www.yourdomain.com)'
 
数据爬取效果展示:

四、总结:

1、学习了解scrapy框架写代码熟悉数据流的流程收获还是很多的。
2、感觉不是太复杂的网站应该都是可以抓的。形成了自己的一套系统知识体系,具体情况具体分析吧。
3、验证码这块简单的还能识别,复杂的可能得稍微用点深度学习了,识别率很一般,暂时还是人工输入吧。
4、爬虫只是很入门的技术,后续需要学的东西还好多。
额,看到这里也是不容易,说了这么多,关键还是直接打包工程源码:点击打开链接
 
 
转载:http://blog.csdn.net/zengsl233/article/details/52294760

基于scrapy的分布式爬虫抓取新浪微博个人信息和微博内容存入MySQL的更多相关文章

  1. 基于Thinkphp5+phpQuery 网络爬虫抓取数据接口,统一输出接口数据api

    TP5_Splider 一个基于Thinkphp5+phpQuery 网络爬虫抓取数据接口 统一输出接口数据api.适合正在学习Vue,AngularJs框架学习 开发demo,需要接口并保证接口不跨 ...

  2. Python分布式爬虫抓取知乎用户信息并进行数据分析

    在以前的文章中,我写过一篇使用selenium来模拟登录知乎的文章,然后在很长一段时间里都没有然后了... 不过在最近,我突然觉得,既然已经模拟登录到了知乎了,为什么不继续玩玩呢?所以就创了一个项目, ...

  3. python爬虫抓取哈尔滨天气信息(静态爬虫)

    python 爬虫 爬取哈尔滨天气信息 - http://www.weather.com.cn/weather/101050101.shtml 环境: windows7 python3.4(pip i ...

  4. 笔趣看小说Python3爬虫抓取

    笔趣看小说Python3爬虫抓取 获取HTML信息 解析HTML信息 整合代码 获取HTML信息 # -*- coding:UTF-8 -*- import requests if __name__ ...

  5. scrapy抓取拉勾网职位信息(一)——scrapy初识及lagou爬虫项目建立

    本次以scrapy抓取拉勾网职位信息作为scrapy学习的一个实战演练 python版本:3.7.1 框架:scrapy(pip直接安装可能会报错,如果是vc++环境不满足,建议直接安装一个visua ...

  6. 基于 Scrapy-redis 的分布式爬虫详细设计

    基于 Scrapy-redis 的分布式爬虫设计   目录 前言 安装 环境 Debian / Ubuntu / Deepin 下安装 Windows 下安装 基本使用 初始化项目 创建爬虫 运行爬虫 ...

  7. [转]使用Scrapy建立一个网站抓取器

    英文原文:Build a Website Crawler based upon Scrapy 标签: Scrapy Python 209人收藏此文章, 我要收藏renwofei423 推荐于 11个月 ...

  8. python 全栈开发,Day140(RabbitMQ,基于scrapy-redis实现分布式爬虫)

    一.RabbitMQ 队列 在生产者消费模型中,比如去餐馆吃饭的例子.生产者相当于厨师,队列相当于服务员,消费者就是你. 我们必须通过服务员,才能吃饭! 如果队列满了,队列会一直hold住.必须让消费 ...

  9. 测试开发Python培训:抓取新浪微博抓取数据-技术篇

    测试开发Python培训:抓取新浪微博抓取数据-技术篇   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.在poptest的se ...

随机推荐

  1. 【数据库_Postgresql】数据库主键自增长之加序列和不加序列2种方法

    将表的主键进行序列增加之后可以在数据库层面自动主键id增长 方法如下:先建序列,然后建表关联id主键,然后添加语句,不用考虑id主键 DROP SEQUENCE IF EXISTS "pub ...

  2. vue使用过程中的一些小技巧

    这些也是自己平时项目中遇到过的一些问题,看到有人整理了出来,也就转载保存一下 文章内容总结: 组件style的scoped Vue 数组/对象更新 视图不更新 vue filters 过滤器的使用 列 ...

  3. 【JavaScript】离线应用与客户端存储

    一.前言        这章非常重要,由于之后需要负责平台手机APP的日后维护,如何让用户在离线状态下正常使用,以及联网后的数据合并变得非常重要. 二.内容        离线检测 navigator ...

  4. 电子商务(电销)平台中用户模块(User)数据库设计明细

    以下是自己在电子商务系统设计中的订单模块的数据库设计经验总结,而今发表出来一起分享,如有不当,欢迎跟帖讨论~ 用户基础表(user_base)|-- 自动编号 (user_id)|-- 用户名 (us ...

  5. 服务器上的 Git - 在服务器上搭建 Git

    http://git-scm.com/book/zh/v2/%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A%E7%9A%84-Git-%E5%9C%A8%E6%9C%8D%E ...

  6. Stanford机器学习---第十四讲.机器学习应用举例之Photo OCR

    http://blog.csdn.net/l281865263/article/details/50278745 本栏目(Machine learning)包括单参数的线性回归.多参数的线性回归.Oc ...

  7. PID控制算法的C语言实现三 位置型PID的C语言实现

    上一节中已经抽象出了位置性PID和增量型PID的数学表达式,这一节,重点讲解C语言代码的实现过程,算法的C语言实现过程具有一般性,通过PID算法的C语言实现,可以以此类推,设计其它算法的C语言实现. ...

  8. UESTC--1267

    原题链接:http://www.acm.uestc.edu.cn/problem.php?pid=1267 分析:此题麻烦之处在于要输出最小最长上升子序列,关键在于如何解决最小这个问题. 我的做法是从 ...

  9. 省选模拟赛 LYK loves graph(graph)

    题目描述 LYK喜欢花花绿绿的图片,有一天它得到了一张彩色图片,这张图片可以看做是一张n*m的网格图,每个格子都有一种颜色去染着,我们用-1至n*m-1来表示一个格子的颜色.特别地,-1代表这个颜色是 ...

  10. 关于GCD的几个结论

    设a和b的最大公约数是d,那么: 1. d是用sa+tb(s和t都是整数)能够表示的最小正整数 证明:设x=sa+tb是sa+tb能够表示出的最小正整数.首先,有d|x,证明如下: 因此有x>= ...