输入关键字 抓取所有网页( mysql+redis安装可查阅百度(很简单)项目开发流程介绍 )

优采云 发布时间: 2021-10-29 14:03

  输入关键字 抓取所有网页(

mysql+redis安装可查阅百度(很简单)项目开发流程介绍

)

  

  图像.png

  前几天,由于工作需要,我需要抓取一个特定的关键字来提取百度中的搜索结果,并将50页的数据保存在一个数据库或一个.csv文件中。(每天爬一次)

  1.项目需要环境安装

  1)scrapy+selenium+chrome (phantomjs)

  关于爬虫依赖的环境的安装,我已经介绍过了。你可以参考这个文章我的详细介绍。

  2)mysql+redis安装数据库安装可以参考百度(很简单)

  2.项目开发流程介绍

  我们需要模拟用户行为,在浏览器输入框中输入指定关键字,模拟点击获取想要的数据,保存过滤这个页面显示的数据,模拟翻页,抓取这个关键字的前50个页面展示,获取我们想要的数据,保存在.csv文件或者redis数据库中,供以后数据分析使用。

  3.详细开发代码

  1)创建一个scrapy项目

  scrapy startproject keyword_scrawl

  scrapy genspider 重新测试

  代码中各个文件的介绍

  settings.py 是一个通用的配置文件:

  BOT_NAME:项目名称

  蜘蛛模块:

  NEWSPIDER_MODULE:

  下面模块的配置路径

  pipelines.py 这个是数据存储相关的文件

  可以自定义 middlewares.py 使scrapy 更可控

  items.py 文件有点类似于 django 中的一个表单,它定义了数据存储的格式

  ,但是比django的表单应用要简单,因为它的字段很单一。

  Spider文件夹:这个文件夹存放了一个特定的网站爬虫。通过命令行,我们可以创建我们自己的蜘蛛。

  4.蜘蛛代码详解

  def make_requests_from_url(self, url):        if self.params['st_status'] == 1:            return Request(url, meta={'keyword': self.keyword, 'engine':self.sousu, 'phantomjs':True})        else:

            return Request(url)

  首先修改spider中的make_requests_from_url函数,增加一个判断。当st_status==1时,当我们返回请求对象时,添加一个meta,在meta中携带我们要搜索的key和我们需要访问的浏览器地址。以及启动phantomjs的指令。

  class PhantomJSMiddleware(object):    @classmethod

    def process_request(cls, request, spider):

        if request.meta.has_key('phantomjs'):

            keyword = request.meta.get('keyword')

            dcap = dict(DesiredCapabilities.PHANTOMJS)

            dcap["phantomjs.page.settings.userAgent"] = ('Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0')

            dcap["phantomjs.page.settings.AcceptLanguage"] = ('zh-CN,zh;q=0.9')

            driver = webdriver.PhantomJS(desired_capabilities=dcap)

            driver.set_page_load_timeout(100)

            driver.set_script_timeout(15)            try:

                driver.get(request.url)                if request.meta.get('engine') == 1:

                    driver.find_element_by_id("query").send_keys(keyword)

                    driver.find_element_by_class_name("swz").click()                elif request.meta.get('engine') == 2:

                    driver.find_element_by_id("kw").send_keys(keyword)

                    driver.find_element_by_id("su").click()

                time.sleep(2)

                final_url = driver.current_url                if final_url != request.url:

                    fullurl = final_url                else:

                    fullurl = request.url

                content = driver.page_source.encode('utf-8','ignore')

                driver.quit()                return HtmlResponse(fullurl, encoding='utf-8', body=content, request=request)            except Exception, e:

                driver.quit()                print e

  其次,修改middlewares中间件中的类方法process_request,该方法默认携带request和spider对象,在我们刚刚修改的make_requests_from_url方法中。这里我们可以处理前面的make_requests_from_url函数返回的Request请求,然后加载selenium和phantomjs来获取我们需要访问的浏览器和关键字。这段代码会模拟用户获取关键字内容的行为,然后将页面内容返回给scrapy.http中的HtmlResponse对象。这样我们就可以在spider中的parse函数中得到刚刚抓取的内容response.body。

      # 判断页面的返回状态

        if int(response.status) >= 200 and int(response.status)  3000:

                content = content[:3000]            #elif len(content) == 0:

                #yield scrapy.Request(url=response.url, meta={'url':response.url, 'phantomjs':True}, callback=self.pang_bo)

            body = item['url']+','+item['crawl_time']+','+item['title'].replace(',','') +','+content+'\n'

            if '正在进入' == item['title']:

                file_name = os.path.join(self.filetxt,time.strftime('%Y%m%d%H')+'keyword.csv')                with open(file_name, 'a') as b:

                    b.write(body)            else:

                filename = os.path.join(self.filetxt,time.strftime('%Y%m%d%H')+'.csv')                with open(filename, 'a') as f:

                    f.write(body)# 过滤网页源代码def soup_text(body):

    try:

        soup = BeautifulSoup(body, 'lxml')

        line = re.compile(r'\s+')

        line = line.sub(r'', soup.body.getText())

        p2 = re.compile(u'[^\u4e00-\u9fa5]')  # 中GDAC\u4e00\u9fa5

        str2 = p2.sub(r'', line)

        outStr = str2.strip(',')    except:

        outStr = ''

    return outStr

  这段代码主要是忽略了一些不必要的网站,然后提取item字段,以及page body(这里过滤了源代码),然后将获取到的内容保存到.csv文件中。这只是一个简单的爬虫。要反向抓取,请进行如下设置:

  LOG_STDOUT = True    # 将进程所有的标准输出(及错误)将会被重定向到log中(为了方便调试)DOWNLOAD_DELAY=0.25    # 下载延时设置 单位秒DOWNLOAD_TIMEOUT = 60  # 下载超时设置(单位秒)CONCURRENT_ITEMS = 200  # 同时处理的itmes数量CONCURRENT_REQUESTS = 16 # 同时并发的请求

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线