scrapy爬知乎问题,每次爬到240000多以后就结束了,啥原因

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了scrapy爬知乎问题,每次爬到240000多以后就结束了,啥原因相关的知识,希望对你有一定的参考价值。

  发网络爬虫应该选择Nutch、Crawler4j、WebMagic、scrapy、WebCollector其按照我经验随便扯淡:面说爬虫基本3类:1.布式爬虫:Nutch
  2.JAVA单机爬虫:Crawler4j、WebMagic、WebCollector
  3. 非JAVA单机爬虫:scrapy
  第类:布式爬虫
  爬虫使用布式主要解决两问题:
  1)海量URL管理
  2)网速
  现比较流行布式爬虫ApacheNutch于数用户说Nutch几类爬虫选择理由:
  1)Nutch搜索引擎设计爬虫数用户需要做精准数据爬取(精抽取)爬虫Nutch运行套流程三二搜索引擎设计精抽取没太意义说用Nutch做数据抽取浪费间必要计算且试图通Nutch进行二发使适用于精抽取业务基本要破坏Nutch框架Nutch改面目全非修改Nutch能力真自重新写布式爬虫框架
  2)Nutch依赖hadoop运行hadoop本身消耗间集群机器数量较少爬取速度反单机爬虫快
  3)Nutch虽套插件机制且作亮点宣传看些源Nutch插件提供精抽取功能发Nutch插件都知道Nutch插件系统蹩脚利用反射机制加载调用插件使程序编写调试都变异困难更别说面发套复杂精抽取系统且Nutch并没精抽取提供相应插件挂载点Nutch插件五六挂载点五六挂载点都搜索引擎服务并没精抽取提供挂载点数Nutch精抽取插件都挂载页面解析(parser)挂载点挂载点其实解析链接(续爬取提供URL)及搜索引擎提供些易抽取网页信息(网页meta信息、text文本)
  4)用Nutch进行爬虫二发爬虫编写调试所需间往往单机爬虫所需十倍间止解Nutch源码习本高何况要让团队都读懂Nutch源码调试程现除程序本身外各种问题(hadoop问题、hbase问题)
  5)说Nutch2gora持久化数据avro文件、hbase、mysql等其实理解错说持久化数据指URL信息(URL管理所需要数据)存放avro、hbase、mysql并要抽取结构化数据其实数说URL信息存哪所谓
  6)Nutch2版本目前并适合发官现稳定Nutch版本nutch2.2.1版本绑定gora-0.3想用hbase配合nutch(数用nutch2用hbase)能使用0.90版本左右hbase相应要hadoop版本降hadoop 0.2左右且nutch2官教程比较误导作用Nutch2教程两别Nutch1.xNutch2.xNutch2.x官网写支持hbase 0.94实际Nutch2.x意思Nutch2.3前、Nutch2.2.1版本版本官SVN断更新且非稳定(直修改)
  所要做搜索引擎尽量要选择Nutch作爬虫些团队喜欢跟风非要选择Nutch发精抽取爬虫其实冲着Nutch名气(Nutch作者Doug Cutting)结往往项目延期完
  要做搜索引擎Nutch1.x非选择Nutch1.xsolr或者es配合构套非强搜索引擎非要用Nutch2建议等Nutch2.3发布再看目前Nutch2非稳定版本
  第二类:JAVA单机爬虫
  JAVA爬虫单独类JAVA网络爬虫块态圈非完善相关资料全能争议我随便扯淡
  其实源网络爬虫(框架)发非简单难问题复杂问题都前解决(比DOM树解析定位、字符集检测、海量URL重)说毫技术含量包括Nutch其实Nutch技术难点发hadoop本身代码非简单网络爬虫某种意义说类似遍历本机文件查找文件信息没任何难度言所选择源爬虫框架省事比爬虫URL管理、线程池类模块谁都能做要做稳定需要段间调试修改
  于爬虫功能说用户比较关问题往往:
  1)爬虫支持线程、爬虫能用代理、爬虫爬取重复数据、爬虫能爬取JS信息
  支持线程、支持代理、能滤重复URL都叫源爬虫叫循环执行http请求
  能能爬js信息爬虫本身没太关系爬虫主要负责遍历网站载页面爬js信息网页信息抽取模块关往往需要通模拟浏览器(htmlunit,selenium)完些模拟浏览器往往需要耗费间处理页面所种策略使用些爬虫遍历网站遇需要解析页面网页相关信息提交给模拟浏览器完JS信息抽取
  2)爬虫爬取ajax信息
  网页些异步加载数据爬取些数据两种:使用模拟浏览器(问题1描述)或者析ajaxhttp请求自ajax请求url获取返数据自ajax请求使用源爬虫意义哪其实要用源爬虫线程池URL管理功能(比断点爬取)
  我已经我所需要ajax请求(列表)何用些爬虫些请求进行爬取
  爬虫往往都设计广度遍历或者深度遍历模式遍历静态或者态页面爬取ajax信息属于deep web(深网)范畴虽数爬虫都直接支持通些完比WebCollector使用广度遍历遍历网站爬虫第轮爬取爬取种集合(seeds)所url简单说ajax请求作种放入爬虫用爬虫些种进行深度1广度遍历(默认广度遍历)
  3)爬虫爬取要登陆网站
  些源爬虫都支持爬取指定cookies模拟登陆主要靠cookies至于cookies获取爬虫管事情手获取、用http请求模拟登陆或者用模拟浏览器自登陆获取cookie
  4)爬虫抽取网页信息
  源爬虫般都集网页抽取工具主要支持两种规范:CSS SELECTORXPATH至于哪评价
  5)爬虫保存网页信息
  些爬虫自带模块负责持久化比webmagic模块叫pipeline通简单配置爬虫抽取信息持久化文件、数据库等些爬虫并没直接给用户提供数据持久化模块比crawler4jwebcollector让用户自网页处理模块添加提交数据库操作至于使用pipeline种模块操作数据库使用ORM问题类似取决于业务
  6)爬虫网站封办
  爬虫网站封般用代理(随机代理)解决些源爬虫般没直接支持随机代理切换所用户往往都需要自获取代理放全局数组自写代理随机获取(数组)代码
  7)网页调用爬虫
  爬虫调用Web服务端调用平用用些爬虫都使用
  8)爬虫速度
  单机源爬虫速度基本都讲本机网速用极限爬虫速度慢往往用户线程数少、网速慢或者数据持久化数据库交互速度慢些东西往往都用户机器二发代码决定些源爬虫速度都
  9)明明代码写爬数据爬虫问题换爬虫能解决
  代码写爬数据换其爬虫爬遇种情况要网站封要爬数据javascript爬数据通换爬虫能解决
  10)哪爬虫判断网站否爬完、爬虫根据主题进行爬取
  爬虫判断网站否爬完能尽能覆盖
  至于根据主题爬取爬虫内容爬才知道主题所般都整爬再筛选内容嫌爬太泛通限制URL则等式缩范围
  11)哪爬虫设计模式构架比较
  设计模式纯属扯淡说软件设计模式都软件发完总结几设计模式设计模式软件发没指导性作用用设计模式设计爬虫使爬虫设计更加臃肿
  至于构架源爬虫目前主要细节数据结构设计比爬取线程池、任务队列些家都能控制爬虫业务太简单谈构架
  所于JAVA源爬虫我觉随便找用顺手业务复杂拿哪爬虫都要经复杂二发才满足需求
  第三类:非JAVA单机爬虫
  非JAVA语言编写爬虫优秀爬虫单独提取作类并针爬虫本身质量进行讨论针larbin、scrapy类爬虫发本影响
  先说python爬虫python用30行代码完JAVA 50行代码干任务python写代码确快调试代码阶段python代码调试往往耗费远远于编码阶段省间使用python发要保证程序确性稳定性需要写更测试模块爬取规模、爬取业务复杂使用scrapy种爬虫蛮错轻松完爬取任务
  于C++爬虫说习本比较且能计算习本软件需要团队发或者交接习本软件调试容易
  些ruby、php爬虫评价确些非型数据采集任务用ruby或者php便选择些语言源爬虫面要调研相关态圈些源爬虫能些搜BUG(用少、资料少)
参考技术A 服务器需要参数没传全
建议抓包:模拟get 或post

python爬虫如何爬知乎的话题?

因为要做观点,观点的屋子类似于知乎的话题,所以得想办法把他给爬下来,搞了半天最终还是妥妥的搞定了,代码是python写的,不懂得麻烦自学哈!懂得直接看代码,绝对可用

#coding:utf-8
from fileinput import filename
__author__ = ‘haoning‘
__crawler for http://www.guandn.com/

#!/usr/bin/env python

import urllib
import urllib2
import time
import re
import json
import uuid
import platform
import os
import sys
import cookielib
import MySQLdb as mdb
from bs4 import BeautifulSoup

reload(sys)
sys.setdefaultencoding( "utf-8" )

headers = {
   ‘User-Agent‘ : ‘Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:35.0) Gecko/20100101 Firefox/35.0‘,
   ‘Content-Type‘:‘application/x-www-form-urlencoded; charset=UTF-8‘,
   ‘X-Requested-With‘:‘XMLHttpRequest‘,
   ‘Referer‘:‘https://www.zhihu.com/topics‘,
   ‘Cookie‘:‘__utma=51854390.517069884.1416212035.1416212035.1416212035.1; q_c1=c02bf44d00d240798bfabcfc95baeb56|1455778173000|1416205243000; _za=b1c8ae35-f986-46a2-b24a-cb9359dc6b2a; aliyungf_tc=AQAAAJ1m71jL1woArKqF22VFnL/wRy6C; _xsrf=9d494558f9271340ab24598d85b2a3c8; cap_id="MDNiMjcwM2U0MTRhNDVmYjgxZWVhOWI0NTA2OGU5OTg=|1455864276|2a4ce8247ebd3c0df5393bb5661713ad9eec01dd"; n_c=1; _alicdn_sec=56c6ba4d556557d27a0f8c876f563d12a285f33a‘
}

DB_HOST = ‘127.0.0.1‘
DB_USER = ‘root‘
DB_PASS = ‘root‘

conn = mdb.connect(DB_HOST, DB_USER, DB_PASS, ‘zhihu‘, charset=‘utf8‘)
conn.autocommit(False)
curr = conn.cursor()

def get_html(url):
    try:
        req = urllib2.Request(url)
        response = urllib2.urlopen(req,None,20) #鍦ㄨ繖閲屽簲璇ュ姞鍏ヤ唬鐞?
        html = response.read()
        return html
    except:
        print "timeout"
    return None

def getTopics():
    url = ‘https://www.zhihu.com/topics‘
    print url
    try:
        req = urllib2.Request(url)
        response = urllib2.urlopen(req) #鍦ㄨ繖閲屽簲璇ュ姞鍏ヤ唬鐞?
        html = response.read().decode(‘utf-8‘)
        print html
        soup = BeautifulSoup(html)
        lis = soup.find_all(‘li‘, {‘class‘ : ‘zm-topic-cat-item‘})
        
        for li in lis:
            data_id=li.get(‘data-id‘)
            name=li.text
            curr.execute(‘select id from classify_new where name=%s‘,(name))
            y= curr.fetchone()
            if not y:
                curr.execute(‘INSERT INTO classify_new(data_id,name)VALUES(%s,%s)‘,(data_id,name))
        conn.commit()
    except Exception as e:
        print "get topic error",e
        

def get_extension(name):  
    where=name.rfind(‘.‘)
    if where!=-1:
        return name[where:len(name)]
    return None


def which_platform():
    sys_str = platform.system()
    return sys_str

def GetDateString():
    when=time.strftime(‘%Y-%m-%d‘,time.localtime(time.time()))
    foldername = str(when)
    return foldername 

def makeDateFolder(par,classify):
    try:
        if os.path.isdir(par):
            newFolderName=par + ‘//‘ + GetDateString() + ‘//‘  +classify
            if which_platform()=="Linux":
                newFolderName=par + ‘/‘ + GetDateString() + "/" +classify
            if not os.path.isdir( newFolderName ):
                os.makedirs( newFolderName )
            return newFolderName
        else:
            return None 
    except Exception,e:
        print "kk",e
    return None 

def download_img(url,classify):
    try:
        extention=get_extension(url)
        if(extention is None):
            return None
        req = urllib2.Request(url)
        resp = urllib2.urlopen(req,None,15)
        dataimg=resp.read()
        name=str(uuid.uuid1()).replace("-","")+"_www.guandn.com"+extention
        top="E://topic_pic"
        folder=makeDateFolder(top, classify)
        filename=None
        if folder is not None:
            filename  =folder+"//"+name
        #print "filename",filename
        try:
            if "e82bab09c_xs" not in str(url):
                if not os.path.exists(filename):
                    file_object = open(filename,‘w+b‘)
                    file_object.write(dataimg)
                    file_object.close()
                    return GetDateString()+‘/‘+classify+"/"+name
                else:
                    print "file exist"
                    return None
        except IOError,e1:
            print "e1=",e1
            pass
    except Exception as e:
        print "eee",e
        pass
    return None #濡傛灉娌℃湁涓嬭浇涓嬫潵灏卞埄鐢ㄥ師鏉ョ綉绔欑殑閾炬帴
    
                
def get_topis(top_id,topic_name):
    url = ‘https://www.zhihu.com/node/TopicsPlazzaListV2‘
    isGet = True;
    offset = -20;
    top_id=str(top_id)
    while isGet:
        offset = offset + 20
        values = {‘method‘: ‘next‘, ‘params‘: ‘{"topic_id":‘+top_id+‘,"offset":‘+str(offset)+‘,"hash_id":""}‘}
        try:
            data = urllib.urlencode(values)
            request = urllib2.Request(url,data,headers)
            response = urllib2.urlopen(request)
            html=response.read().decode(‘utf-8‘)
            if html is None:
                return
            json_str = json.loads(html)
            ms=json_str[‘msg‘]
            if len(ms) <5:
                break
            msg=ms[0]
            #print msg
            soup = BeautifulSoup(str(msg))
            blks = soup.find_all(‘div‘, {‘class‘ : ‘blk‘})
            for blk in blks:
                page=blk.find(‘a‘).get(‘href‘)
                if page is not None:
                    node=page.replace("/topic/","")
                    print node,page
        except urllib2.URLError, e:
            print "error is",e
            pass
                

def work():
    #getTopics() #鑾峰緱璇濋
    curr.execute(‘select data_id,name from classify_new‘)
    results = curr.fetchall()
    for r in results:
        data_id=r[0]
        name=r[1]
        get_topis(data_id,name)
        
if __name__ == ‘__main__‘:
    i=0
    while i< 40:
        work()
        i=i+1

  

说下数据库的问题,我这里就不传附件了,看字段自己建立,因为这确实太简单了,我是用的mysql,你看自己的需求自己建。

有什么不懂得麻烦去去转盘网找我,因为这个也是我开发的,上面会及时更新qq群号,这里不留qq号啥的,以免被系统给K了。

以上是关于scrapy爬知乎问题,每次爬到240000多以后就结束了,啥原因的主要内容,如果未能解决你的问题,请参考以下文章

人生苦短,我用Python--一起来爬知乎娘

python爬虫如何爬知乎的话题?

Python爬知乎妹子都爱取啥名

一文读懂:Python爬虫超详细讲解带你实战爬知乎(零基础入门,男女老少都看的懂)

知乎Elasticsearch Crawler

python爬虫scrapy之登录知乎