TomorrowLi's Blog


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

  • 搜索

Elasticsearch搜索引擎

发表于 2021-07-18 | 分类于 elasticsearch
字数统计: 345 | 阅读时长 ≈ 1

一、首先我们安装elasticsearch

    ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。

    我们要下载的是 elasticsearch-rtf, Elasticsearch-RTF是针对中文的一个发行版,即使用最新稳定的elasticsearch版本,并且帮你下载测试好对应的插件,如中文分词插件等,目的是让你可以下载下来就可以直接的使用(虽然es已经很简单了,但是很多新手还是需要去花时间去找配置,中间的过程其实很痛苦),当然等你对这些都熟悉了之后,你完全可以自己去diy了,跟linux的众多发行版是一个意思。

下载地址:github https://github.com/medcl/elasticsearch-rtf

1.运行环境

a.JDK8+
b.系统可用内存>2G

这里如何安装jdk,我不做过多解释,百度上太多教程了。

2.安装elasticsearch

下载之后运行图中的 elasticsearch.bat 文件

image

3.安装 elasticsearch-head 插件

安装elasticsearch-head插件需要nodejs的支持,所以此处讲解一下安装nodejs步骤

可以访问 https://blog.csdn.net/mjlfto/article/details/79772848 里面有详细的步骤。

image

豆瓣输入验证码登陆

发表于 2021-07-18 | 分类于 爬虫 , 反爬方式
字数统计: 341 | 阅读时长 ≈ 2

首先要登陆豆瓣要必须获取验证码

1、获取验证码的图片链接下载到本地

req=r'<img id="captcha_image" src="(.*?)" alt="captcha" class="captcha_image"/>'
yanzhenma=re.findall(req,html.text,re.S)

2、手动输入验证码添加到data中

x=input('请输入验证码:')
data['captcha-solution']=x
data['captcha-id']=captcha_id[0]

3、代码演示

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @Time    : 2018/3/15 20:20
# @Author  : tomorrowli
import requests
import re
import os
import time
import random
from hashlib import md5
def geturl():
    time.sleep(random.randint(2,5))
    url='https://www.douban.com/accounts/login'
    headers={
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36'
    }
    data={
        'source':'index_nav',
        'form_email':'用户名',
        'form_password':'密码',
    }
    html=requests.get(url,headers=headers)
    #print(html.text)
    req=r'<img id="captcha_image" src="(.*?)" alt="captcha" class="captcha_image"/>'
    captcha = r'<input type="hidden" name="captcha-id" value="(.*?)"/>'
    yanzhenma=re.findall(req,html.text,re.S)
    if yanzhenma:
        captcha_id = re.findall(captcha,html.text,re.S)
        html=requests.get(yanzhenma[0])
        #可以采用MD5算法给图片随机取一个名字
        #md5(html.content)
        file_path = '{0}/{1}.{2}'.format(os.getcwd(), md5(html.content).hexdigest(), 'jpg')
        if not os.path.exists(file_path):
            with open(file_path, 'wb') as f:
                f.write(html.content)
                f.close()
        x=input('请输入验证码:')
        data['captcha-solution']=x
        data['captcha-id']=captcha_id[0]
        html = requests.post(url , data=data , headers=headers)
        print(html.status_code)
        print('登陆成功')
    else:
        html=requests.post(url,data=data,headers=headers)
        print('登陆成功')

def main():
    geturl()
if __name__ == '__main__':
    main()

结果展示

image

4、之后可以从豆瓣上获取信息存到数据库中

用scrapy的crawlspider全站爬去数据

发表于 2021-07-18 | 分类于 scrapy
字数统计: 808 | 阅读时长 ≈ 4

一、所需要的库

1、scrapy

二、首先编写一个脚本,运行我们的spider

mport sys
import os
from scrapy.cmdline import execute
#获取系统文件路径
print(os.path.dirname(os.path.abspath(__file__)))
#将文件路加到系统环境下
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
#执行语句
execute(['scrapy','crawl','99spider'])

三、编写spider

# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from ..items import jiankangItemLoader , Crawljiankang99Item
#利用crawlspider全站爬取
class A99spiderSpider(CrawlSpider):
    #spider的名字
    name = '99spider'
    #spider所允许的域名,只能在这些域名下爬取
    allowed_domains = ['www.99.com.cn',
                       'nv.99.com.cn',
                       'ye.99.com.cn',
                       'zyk.99.com.cn',
                       'jf.99.com.cn',
                       'fk.99.com.cn',
                       'zx.99.com.cn',
                       'bj.99.com.cn',
                       'nan.99.com.cn',
                       'nan.99.com.cn',
                       'jz.99.com.cn',
                       'gh.99.com.cn',
                       'news.99.com.cn']
    deny_domains=[]
    #spider的初始域名
    start_urls = ['http://www.99.com.cn/']
    #crawl spider的爬取规则
    rules = (
        #Rule(LinkExtractor(allow=r"http://.*.99.com.cn/"),follow=True),
        #allow是允许爬取的页面,deny是当访问到这些页面是自动过滤,不爬取
        Rule(LinkExtractor(allow=r'.*/\d+.htm',deny=(r'/jijiu/jjsp/\d+.htm',r'/jzzn/.*/\d+.htm',r'/ssbd/jfsp/\d+.htm'
                                                     ,r'/zhongyiyangshengshipin/.*/.html',)), callback='parse_item', follow=True,),
    )
    #利用itemLoader进行对页面的分析
    def parse_item(self, response):
        image_url=response.css('.detail_con img::attr(src)').extract_first()
        item_loader=jiankangItemLoader(item=Crawljiankang99Item(),response=response)
        item_loader.add_css('title','.title_box h1::text')
        item_loader.add_value('url',response.url)
        item_loader.add_css('content','.detail_con')
        #这里必须传入一个list列表,才能利用ImagesPipeline下载图片
        item_loader.add_value('image_url',[image_url])

        jiankang=item_loader.load_item()

        return jiankang

四、编写item

import scrapy
from scrapy.loader import ItemLoader
from scrapy.loader.processors import TakeFirst , MapCompose
#remove掉conten的tag标签
from w3lib.html import remove_tags
#利用item_loader就必须自定义item
class jiankangItemLoader(ItemLoader):
    #自定义item
    default_output_processor = TakeFirst()
def return_value(value):
    return value
class Crawljiankang99Item(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    url=scrapy.Field()
    title=scrapy.Field()
    #用ImagePipelines所要做的
    image_url=scrapy.Field(
        output_processor=MapCompose(return_value)
    )
    image_url_path=scrapy.Field()
    content=scrapy.Field(
        input_processor=MapCompose(remove_tags)
    )

五、编写pipelines存储到mysql数据库中

import MySQLdb
from twisted.enterprise import adbapi
import MySQLdb.cursors
from scrapy.pipelines.images import ImagesPipeline
#image_url对应有一个path属性是下载的图片的地址,对其获取并存到数据库中
class jiankangImagePipeline(ImagesPipeline):
    def item_completed(self, results, item, info):
        if 'image_url' in item:
            for ok,value in results:
                image_file_path=value['path']
            item['image_url_path']=image_file_path
        return item
class Crawljiankang99Pipeline(object):
    def process_item(self, item, spider):
        return item
#使用twisted进行数据的插入
class MysqlTwistePipline(object):
    def __init__(self,dbpool):
        self.dbpool=dbpool
    #静态获取settings文件的值
    @classmethod
    def from_settings(cls,settings):
        dbparms=dict(
            #数据库的地址
            host=settings['MYSQL_HOST'],
            #数据库的名字
            db=settings['MYSQL_DB'] ,
            #数据库的用户名
            user=settings['MYSQL_USER'] ,
            #数据库的名密码
            passwd=settings['MYSQL_PASSWORD'] ,
            charset='utf8',
            cursorclass=MySQLdb.cursors.DictCursor,
            use_unicode=True,
        )
        #对数据进行异步操作
        dbpool=adbapi.ConnectionPool('MySQLdb',**dbparms)
        return cls(dbpool)

    def process_item(self , item , spider):
        #使用twisted将musql变成异步操作
        query=self.dbpool.runInteraction(self.do_insert,item)
        query.addErrback(self.hand_erro)
    def hand_erro(self,failure):
        print(failure)
    #执行sql语句
    def do_insert(self,cursor,item):
        url = item['url']
        image_urls = item['image_url']
        image_url = image_urls[0]
        content = item['content']
        title = item['title']
        image_url_path=item['image_url_path']
        cursor.execute(
            'insert into jiankang(url,title,image_url,image_url_path,content) values(%s,%s,%s,%s,%s)' ,
            (url,title,image_url,image_url_path,content))

六、编写settings

#数据库的配置文件
MYSQL_HOST='127.0.0.1'
MYSQL_USER='root'
MYSQL_PASSWORD=''
MYSQL_DB='test'

import os
#执行pipelines
ITEM_PIPELINES = {
    'scrapy.pipelines.images.ImagesPipeline':1,
   'Crawljiankang99.pipelines.MysqlTwistePipline': 4,
    'Crawljiankang99.pipelines.jiankangImagePipeline':2,
}
#下载的图片链接
IMAGES_URLS_FIELD='image_url'
#获取当前文件的路径
object_url=os.path.abspath(os.path.dirname(__file__))
#对应生成名叫image文件的文件夹来存储图片
IMAGES_STORE=os.path.join(object_url,'image')

结果如图所示

jiankang

Hello World

发表于 2021-01-04
字数统计: 74 | 阅读时长 ≈ 1

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Create a new post

$ hexo new "My New Post"

More info: Writing

Run server

$ hexo server

More info: Server

Generate static files

$ hexo generate

More info: Generating

Deploy to remote sites

$ hexo deploy

More info: Deployment

<i class="fa fa-angle-left"></i>1…45

44 日志
14 分类
38 标签
RSS
GitHub E-Mail ZhiHu
推荐阅读
  • 静觅
  • 廖雪峰python教程
  • stormzhang
  • Howiezhao
  • PyZh
  • Python最佳实践指南
  • 敖丙
  • Top K
© 2024 TomorrowLi
本站访客数:
由 Hexo 强力驱动
|
主题 — NexT.Mist v5.1.3
博客全站共23.3k字