Python-scrapy爬虫

scrapy框架爬虫

  • scrapy框架爬虫简介
    • 安装scrapy
    • 建立scrapy项目
    • 入口函数与入口地址
    • Python的yield语句
  • Scrapy中查找HTML元素
    • Scrapy中查找HTML元素(1)
    • Scrapy中查找HTML元素(2)
    • Scrapy中查找HTML元素(3)
  • Scrapy爬取与存储数据
    • 建立Web网站
    • 编写数据项目类
    • 编写爬虫程序myspider
    • 编写数据管道处理类
    • 设置scrapy的配置文件
    • 运行
  • 编写Scrapy爬虫程序
    • 建立Web网站
    • 编写scrapy爬虫程序

scrapy框架爬虫简介

安装scrapy

windows系统在命令行模式下输入pip install scrapy命令即可。

建立scrapy项目

  1. 进入命令行窗体,在D盘中建立一个文件夹,例如example,进入d:\example然后执行命令:scrapy startproject demo,该命令建立一个名称为demo的scrapy项目。
  2. scrapy项目建立后会在d:\demo中建立demo文件夹,同时下面还有另外一个demo子文件夹,有一些必要的项目文件。
  3. 为了测试这个scrapy项目,先建立一个web网站,可以在d:\example中建立一个server.py程序,如下:
import flask

app=flask.Flask(__name__)
@app.route("/")
def index():
	return "测试scrapy"
if __name__ == "__main__":
	app.run()
  1. 在d:\example\demo\demo\spider文件夹中建立一个自己的python文件,例如MySpider.py,程序如下:
import scrapy

class MySpider(scrapy.Spider):
	name="mySpider"
	
	def start_request(self):
		url = "http://127.0.0.1:5000"
		yield scrapy.Request(url=url,callback=self.parse)
	def parse(self,response):
		print(response.url)
		data=response.body.decode()
		print(data)
  1. 在d:\example\demo\demo文件夹中建立一个执行程序如run.py,程序如下:
from scrapy import cmdline
cmdline.execute("scrapy crawl mySpider -s LOG_ENABLED=False".split())
  1. 保存这些程序并运行run.py,可以看到结果:
http://127.0.0.1:5000
测试scrapy

由此可见程序MySpider.py是访问了我们自己的Web网站并爬取了网站的网页。下面来分析这个程序:
(1). import scrapy 引入scrapy程序包,这个包中有一个请求对象Request与一个响应对象Response类。
(2).

class MySpider(scrapy.Spider): 
	name = "mySpider"

任何一个爬虫程序类都继承与scrapy.Spider类,任何一个爬虫程序都有一个名字,这个名字在整个爬虫项目是唯一的,此项目中的爬虫名字为“mySpider”。
(3)

def start_request(self):
	url = "http://127.0.0.1:5000"
	yield scrapy.Request(url=url,callback=self.parse)

这个地址url是爬虫程序的入口地址,这个start_request函数是程序的入口函数。程序开始时确定要爬取的网站地址,然后建立一个scrapy.Request请求类,向这个类提供url参数,指明要爬取的网页地址。爬取网页完成后就执行默认的回调函数parse。
scrapy的执行过程是异步进行的,即指定一个url网址开始爬取数据时,程序不用一直等待这个网站的响应,如果网站迟迟不响应,那么整个程序就卡死了。但是scrapy提供一个回调函数,网站什么时候响应就什么时候调用这个回调函数,这样有利于对响应时间很长的网站的爬取。
(4)

def parse(self,response):
	print(response.url)
	data=response.body.decode()
	print(data)

回调函数parse包含一个scrapy.Request类的对象response,它是网站响应的一切信息,其中response.url就是网站的网址,response.body是网站响应的二进制数据,即网页的内容。通过decode()解码后变成字符串,就可以用print输出了。
(5) run.py的作用
程序MySpider.py只是一个类,不能单独执行,要执行这个爬虫程序就必须使用scrapy中专门的命令scrapy crawl。可以在命令窗口,在d:\example\demo\demo中执行命令:scrapy crawl mySpider -s LOG_ENABLED=False,那么就可以看到执行后的结果。注:其中mySpider指爬虫程序的名称,后面的参数是不现实调试信息。但是由于窗口的切换比较繁琐,因此设计一个python的run.py,专门用来执行MySpider.py程序。

入口函数与入口地址

在程序中使用了入口函数:

def start_request(self):
	url = "http://127.0.0.1:5000"
	yield scrapy.Request(url=url,callback=self.parse)

实际上这个函数可以用start_urls的入口地址来代替:

start_urls = "http://127.0.0.1:5000"

入口地址可有多个,因此start_urls是一个列表。入口函数与入口地址的作用是一样的。

Python的yield语句

  • 在入口函数,有一条yield语句,主要作用是返回一个值等待被取走。
  • 实例:
def fun():
	s = ['a','b','c']
	for x in s:
		yield x
		print("fun End")
f = fun()
print(f)
for e in f:
	print(e)

程序结果:


a
b
c
fun End

由此可见,fun返回一个generator的对象,这种对象包含一系列的元素,可以使用for循环提取,执行循环的过程如下:

for e in f:
	print(e)
  • 第一次 for e in f 循环,f执行到yield语句,就返回一个值’a’,for循环从f抽取的元素是’a’,然后e=‘a’,打印a。fun中执行到yield时会等待yield返回的值被抽走,同时fun停留在yield语句,一旦被抽走,再次循环,yield返回’b’。
  • 第二次循环 for e in f 循环,抽取f函数的’b’元素,打印出’b’,然后f中循环继续yield返回’c’元素。
  • 第三次循环 for e in f 循环,抽取f函数的’c元素,打印出’c’,然后f中循环就结束了,显示fun End,随后for e in f循环中f也没有元素可以继续抽走了,也结束,随后程序结束。
  • 只要包含yield语句的函数都返回一个generator的可循环对象,执行到yield语句时只是返回一个值,等待调用循环抽取,一旦调用循环抽取后,函数又继续进行。这个过程非常类似两个线程的协助过程,当提供数据的一方准备好数据把yield提交数据时,就等待另外一方把数据抽取走,如果不抽走yield就一直等待,一旦抽走后数据提供方继续它的程序,一直等到出现下一次yield或者程序结束。scrapy的框架使用的是异步执行的过程,因此大量使用yield语句。

Scrapy中查找HTML元素

Scrapy中查找HTML元素(1)

  • 在scrapy中有强大的查找HTML元素的功能,那就是使用xpath方法。xpath方法使用xPath语法,比BeautifulSoup的select要灵活而且速度快。
  • 使用xpath查找HTML中的元素
#从scrapy中引入Selector类,这个类就是选择查找类
from scrapy.selector import Selector
htmlText='''



	Harry Potter
	29.99


	Learning XML
	39.99



'''
selector=Selector(text=htmlText)  
#查看selector的类型
print(type(selector))
print(selector)
#在文档中查找所有的元素,其中“//”表示文档中的任何位置。
s=selector.xpath("//title")
print(type(s))
print(s)
</code></pre> 
  <p>程序结果:</p> 
  <pre><code><class 'scrapy.selector.unified.Selector'>
<Selector xpath=None data=u'<html><body>\n<bookstore>\n<book>\n\t<title '>
<class 'scrapy.selector.unified.SelectorList'>
[<Selector xpath='//title' data=u'<title lang="eng">Harry Potter'>, Learning XML'>]

(1).selector=Selector(text=htmlText) 使用htmlText的文字建立Selector类,就是装载HTML文档,文档装载后就形成一个Selector对象,就可以使用xpath查找元素。
(2). selector.xpath("//tagName")表示在文档中搜索的tags,形成一个Selector的列表。

  • 由此可见一般selector搜索一个的HTML元素的方法是:

    selector.xpath("//tagName")

  • 在装载HTML文档后selector=Selector(text=htmlText)得到的selector是对应全文档顶层的元素的,其中"//"表示全文档搜索,结果是一个Selector的列表,哪怕只有一个元素也成一个列表。

  • selector.xpath("//body")搜索到元素,结果是一个Selector的列表,包含一个Selector元素;

  • selector.xpath("//title")搜索到两个</code>元素,结果是Selector的列表,包含2个Selector元素;</p> </li> <li> <p><code>selector.xpath("//book")</code>搜索到两个元素,结果是Selector的列表,包含2个Selector元素;</p> </li> </ul> <h2>Scrapy中查找HTML元素(2)</h2> <ul> <li>使用“//”表示文档下面的所有节点元素,用“/”表示当前节点的下一级节点元素。</li> <li>“//”与“/”的使用</li> </ul> <ol> <li><code>selector.xpath("//bookstore/book")</code> 搜索<code><bookstore></code>下一级的<code><book></code>元素,找到2个;</li> <li><code>selector.xpath("//body/book")</code> 搜索<code><body></code>的下一级<code><book></code>元素,结果为空;</li> <li><code>selector.xpath("//body//book")</code> 搜索<code><body></code>下的<code><book></code>元素,找到2个;</li> <li><code>selector.xpath("/body//book")</code> 搜索文档下一级的<code><body></code>下的<code><book></code>元素,找结果为空,因为文档的下一级是<code><html></code>元素,而不是<code><body></code>;</li> <li><code>selector.xpath("/html/body//book")</code> 或者<code>selector.xpath("/html//book")</code> 搜索<code><book></code>元素,找到2个;</li> <li><code>selector.xpath("//book/title")</code> 搜索文档中所有<code><book></code>下一级的<code><title></code>元素,找到2个,结果跟<code>selector.xpath("//title")</code> 、<code>selector.xpath("//bookstore//title")</code>一样;</li> <li><code>selector.xpath("//book//price")</code>与<code>selector.xpath("//price")</code>结果一样,都是找到2个<code><price></code>元素。</li> </ol> <ul> <li>使用"."表示当前节点元素,使用xpath可以连续调用,如果前一个xpath返回一个Selector的列表,那么这个列表可以继续调用xpath,功能是为每个列表元素调用xpath,最后结果是全部元素调用xpath的汇总。</li> <li>使用"."进行xpath连续调用</li> </ul> <pre><code>from scrapy.selector import Selector htmlText=''' <html><body> <bookstore> <book> <title>Novel Harry Potter 29.99 TextBook Learning XML 39.99 ''' selector=Selector(text=htmlText) s=selector.xpath("//book").xpath("./title") for e in s: print(e)

    程序结果:

    Novel'>
    Harry Potter'>
    TextBook'>
    Learning XML'>
    
    • selector.xpath("//book")首先搜索到文档中所有元素,总共有2个,然后再次调用xpath("./title"),就是从当前元素开始往下一级搜索</code>,每个<code><book></code>都找到2个<code><title></code>,因此结果有4个<code><title></code>。</li> <li>注意如果<code>xpath</code>连续调用时不指定是从前一个<code>xpath</code>的结果元素开始的,那么默认是从全文档开始的,结果就会不一样,例如:<code>s=selector.xpath("//book").xpath("/title")</code> 结果就是空的,因为后面的<code>xpath("/title")</code>从文档开始搜索<code><title></code>。<code>s=selector.xpath("//book").xpath("//title")</code>结果有10个元素,因为每个<code><book></code>都驱动<code>xpath<"//title"></code>在全文档搜索<code><title></code>元素,每次都搜索到5个元素。</li> </ul> <h2>Scrapy中查找HTML元素(3)</h2> <ul> <li> <p>如果xpath返回的是一个Selector对象列表:</p> <ul> <li>调用extract()函数会得到这些对象的元素文本的列表</li> <li>使用extract_first()获取列表中第一个元素值,如果列表为空,extract_first()的值为None。</li> </ul> </li> <li> <p>xpath返回的是一个单一的Selector对象:</p> <ul> <li>调用extract()函数就可以得到Selector对象对应的元素的文本值。</li> <li>单一的Selector对象没有extract_first()函数。</li> </ul> </li> </ul> <pre><code>from scrapy.selector import Selector htmlText=''' <html> <body> <bookstore> <book id="b1"> <title lang="english">Harry Potter 29.99 learning-XML 39.98 ''' selector=Selector(text=htmlText) s=selector.xpath("//book/price") print(type(s),s) s=selector.xpath("//book/price").extract() print(type(s),s) s=selector.xpath("//book/price").extract_first() print(type(s),s)

      程序结果:

       [, ]
       ['29.99', '39.98']
       29.99
      

      由此可见:s=selector.xpath("//book/price")得到的是SelectorList列表;
      s=selector.xpath("//book/price").extract()得到的是元素的Selector对象对应的元素的文本组成的列表,即[29.99', u'39.98]s=selector.xpath("//book/price").extract_first()得到的是元素的文本组成的列表的第一个元素,是一个文本,即29.99

      • xpath使用"/@attrName"得到一个Selector元素的attrName属性节点对象,属性节点对象也是一个Selector对象,通过extract()函数获取其属性值。
      • 对上述的doc文档获取元素属性值:
      selector=Selector(text=htmlText)
      s=selector.xpath("//book/@id")
      print(s)
      print(s.extract())
      for e in s:
      	print(e.extract())
      

      程序结果:

      [, ]
      ['b1', 'b2']
      b1
      b2
      

      由此可见:s=selector.xpath("//book/@id")结果是2个的id属性组成的SelectorList列表,即属性也是一个Selector对象;print(s.extract())结果是的id属性的两个Selector对象的属性文本值的列表,即['b1','b2']e.extract()获取对象e的属性值。

      • xpath使用"/text()"得到一个Selector元素包含的文本值,文本值节点对象也是一个Selector对象,通过extract()获取文本值。
      • 获取上述doc文档的节点文本值
      selector=Selector(text=htmlText)
      s=selector.xpath("//book/title/text()")
      print(s)
      print(s.extract())
      for e in s:
      	print(e.extract())
      

      程序结果:

      [,]
      ['Harry Potter','Learning-XML']
      Harry Potter
      Learning-XML
      

      由此可见:s=selector.xpath("//book/title/text()")结果也是SelectorList列表,即文本也是一个节点;print(s.extract())结果是文本节点的字符串值的列表,即['Harry Potter','Learning-XML'];最后的for语句,每个e是一个Selector对象,因此extract()获取对象的属性值。值得注意的是如果一个element的元素包含的文本不是单一的文本,那么可能会产生多个文本值。

      • xpath使用"tag[condition]"来限定一个tag元素,其中condition是由这个tag的属性、文本等计算出的一个逻辑值。如果有多个条件,可以写成:"tag[condition1][condition2]...[conditionN]"或者"tag[condition1] and [condition2] and ... and [conditionN]"
      • xpath可以使用position()来确定其中一个元素的限制,这个选择序号是从1开始的,不是从0开始编号的,还可以通过and、or等构造复杂表达式。
      • xpath使用星号"*"代表任何Element节点,不包括Text、Comment的节点。
      • xpath使用"@*"代表任何属性。
      • xpath使用"element/parent::*"选择element的父节点,这个节点只有一个。如果写成"element/parent::tag",就是指定element的tag父节点,除非element的父节点正好是tag节点,不然就为None。
      • xpath使用"element/following-sibling::*"搜索element后面的同级的所有兄弟节点,使用"element/following-sibling::*[position()=1]"搜索element后面的同级的第一个兄弟节点。
      • xpath使用"element/preceding-sibling::*"搜索element前面的同级的所有兄弟节点,使用"element/preceding-sibling::*[position()=1]"搜索element前面的同级的第一个兄弟节点。

      Scrapy爬取与存储数据

      建立Web网站

      使用scrapy startproject demo语句创建一个demo的scrapy项目,在项目中创建一个server.py文件,用来编写网站内容,这个网站有一个网页,返回基本计算机教材,flask程序如下:

      import flask
      app = flask.Flask(__name__)
      
      @app.route("/")
      def index():
          html="""
          
          
              Python程序设计
              James
              人民邮电出版社
          
          
              Java程序设计
              Robert
              人民邮电出版社
          
          
              MySQL数据库
              Steven
              高等教育出版社
          
          
              """
          return html
      
      if __name__=="__main__":
          app.run()
      
      

      编写数据项目类

      程序爬取的数据是多本教材,每本教材有名称与作者,因此要建立一个教材的类,类中包括教材名称title,作者author与出版社publisher。在demo\demo目录下有一个items.py文件就是用来设计数据项目类的,打开文件,并改成如下形式:

      import scrapy
      
      class BookItem(scrapy.Item):
          # define the fields for your item here like:
          # name = scrapy.Field()
          title = scrapy.Field()
          author = scrapy.Field()
          publisher = scrapy.Field()
      

      其中BookItem是我们设计的教材项目类,这个类必须从scrapy.Itrm类继承,在类中定义教材的字段项目,每个字段项目都是一个scrapy.Field对象,定义了3个字段项目,分别用来存储title、author以及publisher。注:可以通过item[“title”]、item[“author”]、item[“publisher”]来获取或设置各个字段的值。

      编写爬虫程序myspider

      在demo\demo\spider目录下新建myspider.py文件,编写程序如下:

      import scrapy
      from scrapy import Selector
      #从demo文件夹的items.py文件中引入BookItem类的定义
      from demo.items import BookItem
      
      class MySpider(scrapy.Spider):
          name = "mySpider"
          start_urls = ["http://127.0.0.1:5000"]
      
          def parse(self, response):
              try:
                  #得到网站数据并建立Selector对象,搜索到所有的节点的元素
                  data = response.body.decode()
                  selector = Selector(text=data)
                  books = selector.xpath("//book")
                  for book in books:
                      item = BookItem()
                      #对于每个节点,在它的下面搜索、<author>、<publisher>节点,并取出它们的文本,组成一个BookItem对象
                      item['title'] = book.xpath("./title/text()").extract_first()
                      item['author'] = book.xpath("./author/text()").extract_first()
                      item['publisher'] = book.xpath("./publisher/text()").extract_first()
                      #向上一级调用函数返回
                      yield item
                      #向上一级调用函数返回,scrapy把BookItem对象推送给与items.py同目录下的pipeline.py文件中的数据管道执行类取处理数据
              except Exception as e:
                  print(e)
      </code></pre> 
        <h2>编写数据管道处理类</h2> 
        <p>在scrapy框架中的demo\demo目录下有一个pipeline.py文件,用来数据管道处理文件,打开这个文件可以看到一个默认的管道类,修改并设计管道程序如下:</p> 
        <pre><code>class BookPipeline(object):
          count=0
          def process_item(self, item, spider):
              BookPipeline.count+=1
              try:
                  if BookPipeline.count==1:
                      fobj=open("books.txt","wt")
                  else:
                      fobj=open("books.txt","at")
                  print(item["title"],item["author"],item["publisher"])
                  fobj.write(item["title"]+","+item["author"]+","+item["publisher"]+"\n")
                  fobj.close()
              except Exception as e:
                  print(e)
              return item
      
      </code></pre> 
        <p>说明:这个类,命名为BookPipeline,它继承自object类,类中最重要的函数是process_item函数,scrapy爬取数据开始会建立一个BookPipeline类对象,然后每爬取一个数据类BookItem项目item,mySpider程序就会把这个对象推送给BookPipeline对象,同时调用process_item函数一次。process_item函数的参数中的item就是推送来的数据,于是就可以在这个函数中保存完整的爬取数据了。</p> 
        <h2>设置scrapy的配置文件</h2> 
        <p>mySpider程序执行后每爬取一个item项目是如何推送给BookPipeline对象并调用process_item函数的呢?前提是必须设置一个通道。在demo文件夹中一个settings.py的设置文件,打开这个文件可以看到很多设置项目,大部分都是用#注释的语句,找到 语句ITEM_PIPLINES的项目,把它设置如下形式:</p> 
        <pre><code># Configure item pipelines
      # See https://doc.scrapy.org/en/latest/topics/item-pipeline.html
      ITEM_PIPELINES = {
          'demo.pipelines.BookPipeline': 300,
      }
      </code></pre> 
        <p>其中ITEM_PIPLINES是一个字典,把关键字改成 ‘demo.pipelines.BookPipeline’,而BookPipelines就是在pipelines.py文件中设计的数据管道类的名称,后面的300是一个默认的整数,可以是任何整数。这样设置后就可以连通爬虫mySpider程序通过yield返回的每项数据推送给pipelines.py程序的BookPipeline类,并执行process_item函数了。</p> 
        <h2>运行</h2> 
        <p>在demo中创建run.py文件,内容见上。运行run.py可得到一个book.txt文件。打开文件,则可见爬取存储数据是否成功。</p> 
        <h1>编写Scrapy爬虫程序</h1> 
        <h2>建立Web网站</h2> 
        <ol> 
         <li>books.html</li> 
        </ol> 
        <pre><code><h3>计算机</h3>
      <ul>
          <li><a href="database.html">数据库</a> </li>
          <li><a href="program.html">程序控制</a> </li>
          <li><a href="network.html">计算机网络</a> </li>
      </ul>
      </code></pre> 
        <ol start="2"> 
         <li>database.html</li> 
        </ol> 
        <pre><code><h3>数据库</h3>
      <ul>
          <li><a href="mysql.html">MySQL数据库</a> </li>
      </ul>
      <a href="books.html">返回首页</a>
      </code></pre> 
        <ol start="3"> 
         <li>program.html</li> 
        </ol> 
        <pre><code><h3>程序设计</h3>
      <ul>
          <li><a href="python.html">Python程序设计</a> </li>
          <li><a href="java.html">Java程序设计</a> </li>
      </ul>
      <a href="books.html">返回首页</a>
      </code></pre> 
        <ol start="4"> 
         <li>network.html</li> 
        </ol> 
        <pre><code><h3>计算机网络</h3>
      <a href="books.html">返回首页</a>
      </code></pre> 
        <ol start="5"> 
         <li>mysql.html</li> 
        </ol> 
        <pre><code><h3>MySQL数据库</h3>
      <a href="books.html">返回首页</a>
      </code></pre> 
        <ol start="6"> 
         <li>python.html</li> 
        </ol> 
        <pre><code><h3>Python程序设计</h3>
      <a href="books.html">返回首页</a>
      </code></pre> 
        <ol start="7"> 
         <li>java.html</li> 
        </ol> 
        <pre><code><h3>Java程序设计</h3>
      <a href="books.html">返回首页</a>
      </code></pre> 
        <ol start="8"> 
         <li>Web服务器程序 <code>flask.py</code></li> 
        </ol> 
        <pre><code>import flask
      import os
      app = flask.Flask(__name__)
      
      def getFile(fileName):
          data = b""
          if os.path.exists(fileName):
              fobj = open(fileName,"rb")
              data = fobj.read()
              fobj.close()
          return data
      
      @app.route("/")
      def index():
          return getFile("books.html")
      
      @app.route("/<section>")
      def process(section):
          data = ""
          if section != "":
              data = getFile(section)
          return data
      
      if __name__ == "__main__":
          app.run()
      </code></pre> 
        <h2>编写scrapy爬虫程序</h2> 
        <p>程序如下</p> 
        <pre><code>import scrapy
      from scrapy import Selector
      
      class MySpider(scrapy.Spider):
          name = "mySpider"
          #入口地址,访问这个网址成功后会回调parse函数 
          start_urls = ["http://127.0.0.1:5000"]
      	#定义一个回调函数,该函数的response对象包含了网站返回的信息
          def parse(self, response):
              try:
                  print(response.url)
                  #网站返回的response.body的二进制函数,要decode转为文本,然后建立Selector对象
                  data = response.body.decode()
                  selector = Selector(text=data)
                  #获取网页中的<h3>标题的文本
                  print(selector.xpath("//h3/text()").extract_first())
                  #获取所有的<a href=...>链接的href值,组成links列表
                  links = selector.xpath("//a/@href").extract()
                  for link in links:
                      url = response.urljoin(link)
                      yield scrapy.Request(url,callback=self.parse)
              except Exception as e:
                  print(e)
      
      </code></pre> 
        <p>运行run.py程序,得到如下结果:</p> 
        <pre><code>http://127.0.0.1:5000
      计算机
      http://127.0.0.1:5000/database.html
      数据库
      http://127.0.0.1:5000/network.html
      计算机网络
      http://127.0.0.1:5000/program.html
      程序设计
      http://127.0.0.1:5000/books.html
      计算机
      http://127.0.0.1:5000/mysql.html
      MySQL数据库
      http://127.0.0.1:5000/python.html
      Python程序设计
      http://127.0.0.1:5000/java.html
      Java程序设计
      </code></pre> 
        <p>说明:scrapy会自动筛选已经访问过的网站,访问links的每个link,通过urljoin函数与response.url地址组合成完整的url地址,再次建立Resquest对象,回调函数仍然为parse,即这个parse函数会被递归调用。其中使用了yield语句返回每个Request对象。</p> 
       </div> 
      </div>
                                  </div>
                              </div>
                          </div>
                          <!--PC和WAP自适应版-->
                          <div id="SOHUCS" sid="1176736529851166720"></div>
                          <script type="text/javascript" src="/views/front/js/chanyan.js"></script>
                          <!-- 文章页-底部 动态广告位 -->
                          <div class="youdao-fixed-ad" id="detail_ad_bottom"></div>
                      </div>
                      <div class="col-md-3">
                          <div class="row" id="ad">
                              <!-- 文章页-右侧1 动态广告位 -->
                              <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                                  <div class="youdao-fixed-ad" id="detail_ad_1"> </div>
                              </div>
                              <!-- 文章页-右侧2 动态广告位 -->
                              <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                                  <div class="youdao-fixed-ad" id="detail_ad_2"></div>
                              </div>
                              <!-- 文章页-右侧3 动态广告位 -->
                              <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                                  <div class="youdao-fixed-ad" id="detail_ad_3"></div>
                              </div>
                          </div>
                      </div>
                  </div>
              </div>
          </div>
          <div class="container">
              <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(爬虫)</h4>
              <div id="paradigm-article-related">
                  <div class="recommend-post mb30">
                      <ul class="widget-links">
                          <li><a href="/article/1892446997915430912.htm"
                                 title="Python中的 redis keyspace 通知_python 操作redis psubscribe(‘__keyspace@0__ ‘)" target="_blank">Python中的 redis keyspace 通知_python 操作redis psubscribe(‘__keyspace@0__ ‘)</a>
                              <span class="text-muted">2301_82243733</span>
      <a class="tag" taget="_blank" href="/search/%E7%A8%8B%E5%BA%8F%E5%91%98/1.htm">程序员</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a>
                              <div>最后Python崛起并且风靡,因为优点多、应用领域广、被大牛们认可。学习Python门槛很低,但它的晋级路线很多,通过它你能进入机器学习、数据挖掘、大数据,CS等更加高级的领域。Python可以做网络应用,可以做科学计算,数据分析,可以做网络爬虫,可以做机器学习、自然语言处理、可以写游戏、可以做桌面应用…Python可以做的很多,你需要学好基础,再选择明确的方向。这里给大家分享一份全套的Pytho</div>
                          </li>
                          <li><a href="/article/1892349116927766528.htm"
                                 title="Selenium使用指南" target="_blank">Selenium使用指南</a>
                              <span class="text-muted">程序员杰哥</span>
      <a class="tag" taget="_blank" href="/search/selenium/1.htm">selenium</a><a class="tag" taget="_blank" href="/search/%E6%B5%8B%E8%AF%95%E5%B7%A5%E5%85%B7/1.htm">测试工具</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E6%B5%8B%E8%AF%95%E7%94%A8%E4%BE%8B/1.htm">测试用例</a><a class="tag" taget="_blank" href="/search/%E8%81%8C%E5%9C%BA%E5%92%8C%E5%8F%91%E5%B1%95/1.htm">职场和发展</a><a class="tag" taget="_blank" href="/search/%E7%A8%8B%E5%BA%8F%E4%BA%BA%E7%94%9F/1.htm">程序人生</a><a class="tag" taget="_blank" href="/search/%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/1.htm">功能测试</a>
                              <div>概述selenium是网页应用中最流行的自动化测试工具,可以用来做自动化测试或者浏览器爬虫等。官网地址为:相对于另外一款web自动化测试工具QTP来说有如下优点:免费开源轻量级,不同语言只需要一个体积很小的依赖包支持多种系统,包括Windows,Mac,Linux支持多种浏览器,包括Chrome,FireFox,IE,safari,opera等支持多语言,包括Java,C,python,c#等主流</div>
                          </li>
                          <li><a href="/article/1892348360938024960.htm"
                                 title="基于Python的搜索引擎的设计与实现" target="_blank">基于Python的搜索引擎的设计与实现</a>
                              <span class="text-muted">AI大模型应用之禅</span>
      <a class="tag" taget="_blank" href="/search/DeepSeek/1.htm">DeepSeek</a><a class="tag" taget="_blank" href="/search/R1/1.htm">R1</a><a class="tag" taget="_blank" href="/search/%26amp%3B/1.htm">&</a><a class="tag" taget="_blank" href="/search/AI%E5%A4%A7%E6%A8%A1%E5%9E%8B%E4%B8%8E%E5%A4%A7%E6%95%B0%E6%8D%AE/1.htm">AI大模型与大数据</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/kotlin/1.htm">kotlin</a><a class="tag" taget="_blank" href="/search/golang/1.htm">golang</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a>
                              <div>搜索引擎,Python,爬虫,自然语言处理,信息检索,索引,算法,数据库1.背景介绍在信息爆炸的时代,海量数据无处不在,高效地获取所需信息变得至关重要。搜索引擎作为信息获取的桥梁,扮演着不可或缺的角色。传统的搜索引擎往往依赖于庞大的服务器集群和复杂的算法,对资源消耗较大,且难以满足个性化搜索需求。基于Python的搜索引擎设计,则凭借Python语言的易学易用、丰富的第三方库和强大的社区支持,为开</div>
                          </li>
                          <li><a href="/article/1892340166937341952.htm"
                                 title="python进程数上限_python 多进程数量 对爬虫程序的影响" target="_blank">python进程数上限_python 多进程数量 对爬虫程序的影响</a>
                              <span class="text-muted">weixin_39759995</span>
      <a class="tag" taget="_blank" href="/search/python%E8%BF%9B%E7%A8%8B%E6%95%B0%E4%B8%8A%E9%99%90/1.htm">python进程数上限</a>
                              <div>1.首先看一下python多进程的优点和缺点多进程优点:1.稳定性好:多进程的优点是稳定性好,一个子进程崩溃了,不会影响主进程以及其余进程。基于这个特性,常常会用多进程来实现守护服务器的功能。然而多线程不足之处在于,任何一个线程崩溃都可能造成整个进程的崩溃,因为它们共享了进程的内存资源池。2.能充分利用多核cpu:由于python设计之初,没预料到多核cpu能够得到现在的发展,只考虑到了单核cpu</div>
                          </li>
                          <li><a href="/article/1892331846763606016.htm"
                                 title="python爬虫--安装XPath Helper" target="_blank">python爬虫--安装XPath Helper</a>
                              <span class="text-muted">S903784597</span>
      <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                              <div>给chrome浏览器安装xpath插件。-从网盘下载xpath的插件文件链接:https://pan.baidu.com/s/1B85d5cLDyAz1xUQqmL3uug?pwd=3306提取码:3306-在chrome中输入chrome://extensions/打开扩展程序。-将从百度网盘中下载的xpath.zip文件直接拖到浏览器的扩展程序页面中-得到chrome插件,将插件开关开启,并且</div>
                          </li>
                          <li><a href="/article/1892316219466379264.htm"
                                 title="使用Python爬虫实时监控行业新闻案例" target="_blank">使用Python爬虫实时监控行业新闻案例</a>
                              <span class="text-muted">海拥✘</span>
      <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                              <div>目录背景环境准备请求网页数据解析网页数据定时任务综合代码使用代理IP提升稳定性运行截图与完整代码总结在互联网时代,新闻的实时性和时效性变得尤为重要。很多行业、技术、商业等领域的新闻都可以为公司或者个人发展提供有价值的信息。如果你有一项需求是要实时监控某个行业的新闻,自动化抓取并定期输出这些新闻,Python爬虫可以帮你轻松实现这一目标。本文将通过一个案例,带你一步一步实现一个简单的Python爬虫</div>
                          </li>
                          <li><a href="/article/1892269295539384320.htm"
                                 title="Python爬虫-猫眼电影的影院数据" target="_blank">Python爬虫-猫眼电影的影院数据</a>
                              <span class="text-muted">写python的鑫哥</span>
      <a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB%E6%A1%88%E4%BE%8B1000%E8%AE%B2/1.htm">爬虫案例1000讲</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/%E7%8C%AB%E7%9C%BC/1.htm">猫眼</a><a class="tag" taget="_blank" href="/search/%E7%94%B5%E5%BD%B1/1.htm">电影</a><a class="tag" taget="_blank" href="/search/%E7%94%B5%E5%BD%B1%E9%99%A2/1.htm">电影院</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE/1.htm">数据</a><a class="tag" taget="_blank" href="/search/%E9%87%87%E9%9B%86/1.htm">采集</a>
                              <div>前言本文是该专栏的第46篇,后面会持续分享python爬虫干货知识,记得关注。本文笔者以猫眼电影为例子,获取猫眼的影院相关数据。废话不多说,具体实现思路和详细逻辑,笔者将在正文结合完整代码进行详细介绍。接下来,跟着笔者直接往下看正文详细内容。(附带完整代码)正文地址:aHR0cHM6Ly93d3cubWFveWFuLmNvbS8=目标:获取猫眼电影的影院数据1.项目场景介绍老规矩,我们还是通过接码</div>
                          </li>
                          <li><a href="/article/1892256428417150976.htm"
                                 title="Python从0到100(四):Python中的运算符介绍(补充)" target="_blank">Python从0到100(四):Python中的运算符介绍(补充)</a>
                              <span class="text-muted">是Dream呀</span>
      <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a>
                              <div>前言:零基础学Python:Python从0到100最新最全教程。想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Python爬虫、Web开发、计算机视觉、机器学习、神经网络以及人工智能相关知识,成为学习学习和学业的先行者!欢迎大家订阅专栏:零基础学Python:Python从0到100最新</div>
                          </li>
                          <li><a href="/article/1892256429172125696.htm"
                                 title="Python从0到100(三十五):beautifulsoup的学习" target="_blank">Python从0到100(三十五):beautifulsoup的学习</a>
                              <span class="text-muted">是Dream呀</span>
      <a class="tag" taget="_blank" href="/search/Dream%E7%9A%84%E8%8C%B6%E8%AF%9D%E4%BC%9A/1.htm">Dream的茶话会</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/beautifulsoup/1.htm">beautifulsoup</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a>
                              <div>前言:零基础学Python:Python从0到100最新最全教程。想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Python爬虫、Web开发、计算机视觉、机器学习、神经网络以及人工智能相关知识,成为学习学习和学业的先行者!欢迎大家订阅专栏:零基础学Python:Python从0到100最新</div>
                          </li>
                          <li><a href="/article/1892196639985168384.htm"
                                 title="python分布式爬虫去重_Python分布式爬虫(三) - 爬虫基础知识" target="_blank">python分布式爬虫去重_Python分布式爬虫(三) - 爬虫基础知识</a>
                              <span class="text-muted">weixin_39997311</span>
      <a class="tag" taget="_blank" href="/search/python%E5%88%86%E5%B8%83%E5%BC%8F%E7%88%AC%E8%99%AB%E5%8E%BB%E9%87%8D/1.htm">python分布式爬虫去重</a>
                              <div>0相关源码1技术选型爬虫能做什么1.1scrapyVSrequests+beautifulsoup做爬虫的时候,经常都会听到scrapyVSrequests+beautifulsoup的组合在本次分布式爬虫实现中只用scrapy而不用后者的原因是:requests和beautifulsoup都是库,scrapy是一个框架框架中可以应用requests等,可以集合很多第三方库基于twisted(异步</div>
                          </li>
                          <li><a href="/article/1892195882443534336.htm"
                                 title="Scrapy分布式爬虫系统" target="_blank">Scrapy分布式爬虫系统</a>
                              <span class="text-muted">ivwdcwso</span>
      <a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91/1.htm">开发</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a><a class="tag" taget="_blank" href="/search/scrapy/1.htm">scrapy</a><a class="tag" taget="_blank" href="/search/%E5%88%86%E5%B8%83%E5%BC%8F/1.htm">分布式</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91/1.htm">开发</a>
                              <div>一、概述在这篇博文中,我们将介绍如何使用Docker来部署Scrapy分布式爬虫系统,包括Scrapyd、Logparser和Scrapyweb三个核心组件。这种部署方式适用于Scrapy项目和Scrapy-Redis分布式爬虫项目。需要安装的组件:Scrapyd-服务端,用于运行打包后的爬虫代码,所有爬虫机器都需要安装。Logparser-服务端,用于解析爬虫日志,配合Scrapyweb进行实时</div>
                          </li>
                          <li><a href="/article/1892186799468507136.htm"
                                 title="使用Python抓取新闻媒体网站的最新头条与相关内容:深入的爬虫开发与数据分析实战" target="_blank">使用Python抓取新闻媒体网站的最新头条与相关内容:深入的爬虫开发与数据分析实战</a>
                              <span class="text-muted">Python爬虫项目</span>
      <a class="tag" taget="_blank" href="/search/2025%E5%B9%B4%E7%88%AC%E8%99%AB%E5%AE%9E%E6%88%98%E9%A1%B9%E7%9B%AE/1.htm">2025年爬虫实战项目</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/1.htm">数据分析</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E6%8C%96%E6%8E%98/1.htm">数据挖掘</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                              <div>引言在互联网时代,新闻媒体网站是人们获取信息和了解世界的重要渠道。随着新闻的即时更新,获取最新头条并进行数据分析成为许多行业领域(如媒体、广告、舆情监测等)的重要需求。通过抓取新闻媒体网站的内容,我们不仅能获取各类新闻文章,还能为后续的数据分析、情感分析、舆情监控等提供基础数据。本篇博客将详细讲解如何使用Python编写一个爬虫,抓取新闻媒体网站的最新头条及其相关内容。我们将使用最新的技术栈,包括</div>
                          </li>
                          <li><a href="/article/1892125650370752512.htm"
                                 title="Python爬虫实战:获取笔趣阁图书信息,并做数据分析" target="_blank">Python爬虫实战:获取笔趣阁图书信息,并做数据分析</a>
                              <span class="text-muted">ylfhpy</span>
      <a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/1.htm">数据分析</a>
                              <div>注意:以下内容仅供技术研究,请遵守目标网站的robots.txt规定,控制请求频率避免对目标服务器造成过大压力!1.环境准备与反爬策略pythonimportrequestsfrombs4importBeautifulSoupimportpandasaspdimportreimporttimeimportrandomfromfake_useragentimportUserAgent#需安装:pip</div>
                          </li>
                          <li><a href="/article/1892090313263083520.htm"
                                 title="如何利用Python爬虫获取淘宝分类详情:实战案例指南" target="_blank">如何利用Python爬虫获取淘宝分类详情:实战案例指南</a>
                              <span class="text-muted">数据小爬虫@</span>
      <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                              <div>在电商领域,淘宝作为中国最大的电商平台之一,其分类详情数据对于市场分析、竞争策略制定以及电商运营优化具有极高的价值。通过Python爬虫技术,我们可以高效地获取这些数据,为电商从业者提供强大的数据支持。本文将详细介绍如何利用Python编写爬虫程序,快速获取淘宝分类详情数据。一、准备工作(一)环境搭建确保你的开发环境中已经安装了以下必要的库:requests:用于发送HTTP请求。Beautifu</div>
                          </li>
                          <li><a href="/article/1892065588717613056.htm"
                                 title="Python 爬虫功能介绍" target="_blank">Python 爬虫功能介绍</a>
                              <span class="text-muted">chengxuyuan1213_</span>
      <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E7%88%AC%E8%99%AB/1.htm">网络爬虫</a>
                              <div>在当今互联网信息爆炸的时代,数据的获取与分析成为了各行各业不可或缺的一部分。Python,作为一种简洁、易读且功能强大的编程语言,凭借其丰富的库和框架,在数据抓取(即网络爬虫)领域展现了极大的优势。本文旨在介绍Python爬虫的基础功能,帮助初学者快速入门,理解爬虫的基本工作原理及常用技术。一、什么是网络爬虫网络爬虫(WebCrawler),又称网络蜘蛛(WebSpider)或网络机器人(WebR</div>
                          </li>
                          <li><a href="/article/1892009610320080896.htm"
                                 title="Python爬虫+数据分析:京东商品评论数据接口" target="_blank">Python爬虫+数据分析:京东商品评论数据接口</a>
                              <span class="text-muted">代码逐梦人</span>
      <a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB%E6%8A%80%E8%83%BD%E6%99%8B%E5%8D%87%E8%B7%AF%E7%BA%BF/1.htm">爬虫技能晋升路线</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/1.htm">数据分析</a>
                              <div>一、引言在电商领域,商品评论数据蕴含着丰富的信息,如消费者的满意度、产品的优缺点等。京东作为国内知名的电商平台,其商品评论数据对于商家进行市场调研、改进产品,以及消费者了解商品真实情况都具有重要价值。通过获取京东商品评论数据接口,我们可以方便、高效地获取这些有价值的信息,为后续的数据分析和决策提供支持。二、接口概述需要说明的是,京东并没有公开免费的商品评论数据接口供开发者随意使用。如果要获取京东商</div>
                          </li>
                          <li><a href="/article/1892009356183007232.htm"
                                 title="python爬虫多线程原理" target="_blank">python爬虫多线程原理</a>
                              <span class="text-muted">代码逐梦人</span>
      <a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB%E6%8A%80%E8%83%BD%E6%99%8B%E5%8D%87%E8%B7%AF%E7%BA%BF/1.htm">爬虫技能晋升路线</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                              <div>多线程爬虫原理与优势在Python爬虫中,多线程是一种提升爬取效率的有效技术。在传统的单线程爬虫里,每次只能处理一个请求,只有等当前请求完成(包括发送请求、等待响应、解析数据)之后,才能开始下一个请求。而多线程爬虫可以让多个请求同时进行,在等待某个请求响应的时间里,CPU可以去处理其他请求,充分利用了CPU时间,大大提高了爬取效率。多线程爬虫的实现步骤1.引入必要的库importrequestsi</div>
                          </li>
                          <li><a href="/article/1892009356849901568.htm"
                                 title="Python爬虫+数据分析:淘宝商品评论页面数据" target="_blank">Python爬虫+数据分析:淘宝商品评论页面数据</a>
                              <span class="text-muted">代码逐梦人</span>
      <a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB%E6%8A%80%E8%83%BD%E6%99%8B%E5%8D%87%E8%B7%AF%E7%BA%BF/1.htm">爬虫技能晋升路线</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/1.htm">数据分析</a>
                              <div>一、引言在电商平台中,商品评论包含了大量消费者的反馈信息,这些信息对于商家了解产品优缺点、改进服务,以及消费者做出购买决策都具有重要价值。淘宝作为国内知名的电商平台,其商品评论页面的数据蕴含着丰富的信息。通过Python爬虫技术获取这些数据,并运用数据分析方法进行处理和解读,可以挖掘出有价值的商业洞察。然而,需要注意的是,淘宝有严格的反爬机制,在进行爬虫操作时要遵守相关法律法规和平台规则,避免过度</div>
                          </li>
                          <li><a href="/article/1891974566327152640.htm"
                                 title="Python网络爬虫-WebSocket数据抓取" target="_blank">Python网络爬虫-WebSocket数据抓取</a>
                              <span class="text-muted">程序小勇</span>
      <a class="tag" taget="_blank" href="/search/faiss/1.htm">faiss</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE/1.htm">网络协议</a><a class="tag" taget="_blank" href="/search/websocket/1.htm">websocket</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                              <div>目录前言1、WebSocket请求的分析通常涉及以下几个方面:2、利用WebSocket爬取数据总结最后,创作不易!非常感谢大家的关注、点赞、评论啦!谢谢三连哦!好人好运连连,学习进步!工作顺利哦!博主介绍:✌专注于前后端、机器学习、人工智能应用领域开发的优质创作者、秉着互联网精神开源贡献精神,答疑解惑、坚持优质作品共享。本人是掘金/腾讯云/阿里云等平台优质作者、擅长前后端项目开发和毕业项目实战,</div>
                          </li>
                          <li><a href="/article/1891930292613083136.htm"
                                 title="流行编程语言全解析:优势、应用与短板" target="_blank">流行编程语言全解析:优势、应用与短板</a>
                              <span class="text-muted">a小胡哦</span>
      <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a><a class="tag" taget="_blank" href="/search/c%E8%AF%AD%E8%A8%80/1.htm">c语言</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/swift/1.htm">swift</a><a class="tag" taget="_blank" href="/search/r%E8%AF%AD%E8%A8%80/1.htm">r语言</a>
                              <div>Python:优势Python以其简洁、易读的语法闻名,新手能快速上手。丰富的库和框架,能极大地提高开发效率。适用领域数据科学与分析:处理和分析大规模数据集,进行数据可视化。典型示例:Google用Python进行数据分析,处理海量数据以支持各种业务决策。机器学习与人工智能:构建和训练模型。典型示例:OpenAI在很多人工智能项目中广泛使用Python,如GPT系列模型的研发。网络爬虫:轻松从网页</div>
                          </li>
                          <li><a href="/article/1891903033600700416.htm"
                                 title="052_爬虫_爬虫相关概念(引用《尚硅谷Python爬虫教程(小)小 白零基础速通》052章)" target="_blank">052_爬虫_爬虫相关概念(引用《尚硅谷Python爬虫教程(小)小 白零基础速通》052章)</a>
                              <span class="text-muted">一个有趣的昵称</span>
      <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                              <div>爬虫解释:通过程序,根据url(http://taobao.com)进行网页的爬取获取有用的信息实用程序模拟浏览器,去向服务发送请求,获取响应信息爬虫的核心爬取网页:爬取整个网页包含了网页中所的内容解析数据:将网页中得到的数据进行解析难点:爬虫和但爬虫之间的博弈爬虫的类型实例通用爬虫百度,360,Google,搜狗等搜索引擎功能访问网页-》抓取数据-》数据储存-》数据处理-》提供检索服务robot</div>
                          </li>
                          <li><a href="/article/1891899750693793792.htm"
                                 title="尚硅谷爬虫note007" target="_blank">尚硅谷爬虫note007</a>
                              <span class="text-muted">CSDNy666999</span>
      <a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a>
                              <div>一、urllib—异常1.urllib.error.HTTPError2.urllib.error.URLError#_*_coding:utf-8_*_#@Time:2025/2/1411:33#@Author:20250206-里奥#@File:demo26_异常#@Project:PythonProject10-14importurllib.requestimporturllib.error</div>
                          </li>
                          <li><a href="/article/1891820495158964224.htm"
                                 title="【Python爬虫(15)】从0到1:Python爬虫实战攻克电商网站动态数据堡垒" target="_blank">【Python爬虫(15)】从0到1:Python爬虫实战攻克电商网站动态数据堡垒</a>
                              <span class="text-muted">奔跑吧邓邓子</span>
      <a class="tag" taget="_blank" href="/search/Python%E7%88%AC%E8%99%AB/1.htm">Python爬虫</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/%E7%94%B5%E5%95%86%E7%BD%91%E7%AB%99/1.htm">电商网站</a><a class="tag" taget="_blank" href="/search/%E5%8A%A8%E6%80%81%E6%95%B0%E6%8D%AE/1.htm">动态数据</a>
                              <div>【Python爬虫】专栏简介:本专栏是Python爬虫领域的集大成之作,共100章节。从Python基础语法、爬虫入门知识讲起,深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑,覆盖网页、图片、音频等各类数据爬取,还涉及数据处理与分析。无论是新手小白还是进阶开发者,都能从中汲取知识,助力掌握爬虫核心技能,开拓技术视野。目录一、引言二、准备工作2.1环境搭建2.2目标电商网站分析三、攻克登</div>
                          </li>
                          <li><a href="/article/1891814682365325312.htm"
                                 title="字节跳动后端或大数据基础知识面试题及参考答案(2万字长文)" target="_blank">字节跳动后端或大数据基础知识面试题及参考答案(2万字长文)</a>
                              <span class="text-muted">大模型大数据攻城狮</span>
      <a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%95%B0%E6%8D%AE/1.htm">大数据</a><a class="tag" taget="_blank" href="/search/%E5%A4%A7%E5%8E%82%E9%9D%A2%E8%AF%95/1.htm">大厂面试</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/leetcode/1.htm">leetcode</a>
                              <div>目录Redis的数据类型Redis数据类型的底层数据结构三次握手、四次挥手Redis持久化机制购物车为什么用Redis存,是永久存储吗MySQL的InnoDB索引数据结构哪些SQL的关键字会让索引失效队列、栈、数组、链表有什么不同讲讲爬虫的构成爬虫抓到的数据不清洗吗?不去重吗?对爬虫的更多了解Linux进程间通信机制进程和线程的区别线程私有的数据讲一下堆排序,每次调整的时间复杂度?堆排序是稳定的吗</div>
                          </li>
                          <li><a href="/article/1891760265066770432.htm"
                                 title="爬虫快速上手之正则表达式总结" target="_blank">爬虫快速上手之正则表达式总结</a>
                              <span class="text-muted">Athena945</span>
      <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/1.htm">正则表达式</a><a class="tag" taget="_blank" href="/search/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/1.htm">正则表达式</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a>
                              <div>目录一、正则表达式二、查找相关方法三、re.Match类的使用四、re.compile()方法的使用五、正则修饰符六、标点符号的特殊意义七、字母的特殊含义八、正则替换九、贪婪模式和非贪婪模式十、正则表达式小结一、正则表达式1、概念正则表达式是一个特殊的字符序列,通常被用来检索、替换那些符合某个模式(规则)的文本;在python中需要通过正则表达式对字符串进行匹配的时候,可以使用re模块实现全部的正</div>
                          </li>
                          <li><a href="/article/1891734789824770048.htm"
                                 title="Go分布式爬虫笔记(五)_golang分布式爬虫架构" target="_blank">Go分布式爬虫笔记(五)_golang分布式爬虫架构</a>
                              <span class="text-muted">2401_87198107</span>
      <a class="tag" taget="_blank" href="/search/golang/1.htm">golang</a><a class="tag" taget="_blank" href="/search/%E5%88%86%E5%B8%83%E5%BC%8F/1.htm">分布式</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a>
                              <div>系统级别优化与架构设计:如何对服务进行拆分如何将服务链接在一起服务调用的关系以及调用频率各种问题:如何让服务随着负载的增加具有可扩展性?是否采用DDD的架构设计?如何进行分布式的协调?选择何种中间件、缓存数据库与存储数据库?使用何种通信方式?如何设计缓存与数据库的关系,才能避免缓存失效之后大量数据直接打到数据库导致的服务响应变慢甚至服务雪崩的问题呢?分布式系统中数据的一致性,如果业务能够接受读取到</div>
                          </li>
                          <li><a href="/article/1891722043909533696.htm"
                                 title="这知识点真细,Python获取HTTP响应头和响应体" target="_blank">这知识点真细,Python获取HTTP响应头和响应体</a>
                              <span class="text-muted">梦想橡皮擦</span>
      <a class="tag" taget="_blank" href="/search/Python%E7%88%AC%E8%99%AB120/1.htm">Python爬虫120</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E6%B5%8F%E8%A7%88%E5%99%A8%E5%B7%A5%E5%85%B7/1.htm">浏览器工具</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/python%E7%88%AC%E8%99%AB/1.htm">python爬虫</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%80%85%E5%B7%A5%E5%85%B7/1.htm">开发者工具</a>
                              <div>哈喽!大家好,我是【梦想橡皮擦】,10年产研经验,致力于Python相关技术栈传播本文如果觉得不错,动动小手点个赞赞吧本文如果发现错误,欢迎在评论区中指正哦技术博客日更者,我喜欢写文章,如果任意一篇文章对你有帮助,就挺好的~欢迎大家订阅专栏⭐️⭐️《Python爬虫120》⭐️⭐️最近更新:2022年3月23日,橡皮擦的第610篇原创博客文章目录⛳️实战案例场景⛳️可获取的响应头⛳️实战案例场景这</div>
                          </li>
                          <li><a href="/article/1891707902046040064.htm"
                                 title="python aiohttp_Python-异步之aiohttp" target="_blank">python aiohttp_Python-异步之aiohttp</a>
                              <span class="text-muted">weixin_39864101</span>
      <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/aiohttp/1.htm">aiohttp</a>
                              <div>什么是aiohttp?一个异步的HTTP客户端\服务端框架,基于asyncio的异步模块。可用于实现异步爬虫,更快于requests的同步爬虫。aiohttp和requestsrequests版爬虫requests同步方式连续30次简单爬取http://httpbin.org网站importrequestsfromdatetimeimportdatetimedeffetch(url):r=requ</div>
                          </li>
                          <li><a href="/article/1891582330024292352.htm"
                                 title="运用python制作一个完整的股票分析系统" target="_blank">运用python制作一个完整的股票分析系统</a>
                              <span class="text-muted">大懒猫软件</span>
      <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/django/1.htm">django</a><a class="tag" taget="_blank" href="/search/beautifulsoup/1.htm">beautifulsoup</a>
                              <div>使用python制作一个股票分析系统,可以通过股票价格走势动态界面,实时动态监测不同类型股票的变化情况。以下是一个完整的股票分析系统开发指南,包括股票价格走势动态界面和实时监测功能。这个系统将结合网络爬虫、数据分析、机器学习和可视化技术,帮助你实时监测不同类型股票的变化情况。1.系统功能概述数据采集:使用网络爬虫技术从财经网站采集股票数据。数据处理:计算技术指标(如KDJ、BOLL)并进行数据预处</div>
                          </li>
                          <li><a href="/article/1891578927214817280.htm"
                                 title="使用 Python 爬虫和 FFmpeg 爬取 B 站高清视频" target="_blank">使用 Python 爬虫和 FFmpeg 爬取 B 站高清视频</a>
                              <span class="text-muted">大懒猫软件</span>
      <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/ffmpeg/1.htm">ffmpeg</a>
                              <div>以下是一个完整的Python爬虫代码示例,用于爬取B站视频并使用FFmpeg合成高清视频。1.准备工作确保安装了以下Python库和工具:bash复制pipinstallrequestsmoviepy2.爬取视频和音频文件B站的视频和音频文件通常是分开存储的,需要分别下载视频和音频文件,然后使用FFmpeg合成。Python复制importrequestsfrommoviepy.editorimp</div>
                          </li>
                                      <li><a href="/article/53.htm"
                                             title="二分查找排序算法" target="_blank">二分查找排序算法</a>
                                          <span class="text-muted">周凡杨</span>
      <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE/1.htm">二分查找</a><a class="tag" taget="_blank" href="/search/%E6%8E%92%E5%BA%8F/1.htm">排序</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E6%8A%98%E5%8D%8A/1.htm">折半</a>
                                          <div> 一:概念 二分查找又称
      折半查找(
      折半搜索/
      二分搜索),优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而 查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表 分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步</div>
                                      </li>
                                      <li><a href="/article/180.htm"
                                             title="java中的BigDecimal" target="_blank">java中的BigDecimal</a>
                                          <span class="text-muted">bijian1013</span>
      <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/BigDecimal/1.htm">BigDecimal</a>
                                          <div>        在项目开发过程中出现精度丢失问题,查资料用BigDecimal解决,并发现如下这篇BigDecimal的解决问题的思路和方法很值得学习,特转载。 
              原文地址:http://blog.csdn.net/ugg/article/de</div>
                                      </li>
                                      <li><a href="/article/307.htm"
                                             title="Shell echo命令详解" target="_blank">Shell echo命令详解</a>
                                          <span class="text-muted">daizj</span>
      <a class="tag" taget="_blank" href="/search/echo/1.htm">echo</a><a class="tag" taget="_blank" href="/search/shell/1.htm">shell</a>
                                          <div>Shell echo命令 
      Shell 的 echo 指令与 PHP 的 echo 指令类似,都是用于字符串的输出。命令格式: 
      echo string 
      您可以使用echo实现更复杂的输出格式控制。 1.显示普通字符串: 
        echo "It is a test" 
      这里的双引号完全可以省略,以下命令与上面实例效果一致: 
        echo Itis a test 2.显示转义</div>
                                      </li>
                                      <li><a href="/article/434.htm"
                                             title="Oracle DBA 简单操作" target="_blank">Oracle DBA 简单操作</a>
                                          <span class="text-muted">周凡杨</span>
      <a class="tag" taget="_blank" href="/search/oracle+dba+sql/1.htm">oracle dba sql</a>
                                          <div> --执行次数多的SQL 
       select sql_text,executions from ( 
           select sql_text,executions from v$sqlarea order by executions desc 
           ) where rownum<81; 
       &nb</div>
                                      </li>
                                      <li><a href="/article/561.htm"
                                             title="画图重绘" target="_blank">画图重绘</a>
                                          <span class="text-muted">朱辉辉33</span>
      <a class="tag" taget="_blank" href="/search/%E6%B8%B8%E6%88%8F/1.htm">游戏</a>
                                          <div>  我第一次接触重绘是编写五子棋小游戏的时候,因为游戏里的棋盘是用线绘制的,而这些东西并不在系统自带的重绘里,所以在移动窗体时,棋盘并不会重绘出来。所以我们要重写系统的重绘方法。 
        在重写系统重绘方法时,我们要注意一定要调用父类的重绘方法,即加上super.paint(g),因为如果不调用父类的重绘方式,重写后会把父类的重绘覆盖掉,而父类的重绘方法是绘制画布,这样就导致我们</div>
                                      </li>
                                      <li><a href="/article/688.htm"
                                             title="线程之初体验" target="_blank">线程之初体验</a>
                                          <span class="text-muted">西蜀石兰</span>
      <a class="tag" taget="_blank" href="/search/%E7%BA%BF%E7%A8%8B/1.htm">线程</a>
                                          <div>一直觉得多线程是学Java的一个分水岭,懂多线程才算入门。 
      之前看《编程思想》的多线程章节,看的云里雾里,知道线程类有哪几个方法,却依旧不知道线程到底是什么?书上都写线程是进程的模块,共享线程的资源,可是这跟多线程编程有毛线的关系,呜呜。。。 
       
      线程其实也是用户自定义的任务,不要过多的强调线程的属性,而忽略了线程最基本的属性。 
      你可以在线程类的run()方法中定义自己的任务,就跟正常的Ja</div>
                                      </li>
                                      <li><a href="/article/815.htm"
                                             title="linux集群互相免登陆配置" target="_blank">linux集群互相免登陆配置</a>
                                          <span class="text-muted">林鹤霄</span>
      <a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a>
                                          <div>配置ssh免登陆 
      1、生成秘钥和公钥    ssh-keygen -t rsa 
      2、提示让你输入,什么都不输,三次回车之后会在~下面的.ssh文件夹中多出两个文件id_rsa 和 id_rsa.pub 
         其中id_rsa为秘钥,id_rsa.pub为公钥,使用公钥加密的数据只有私钥才能对这些数据解密    c</div>
                                      </li>
                                      <li><a href="/article/942.htm"
                                             title="mysql : Lock wait timeout exceeded; try restarting transaction" target="_blank">mysql : Lock wait timeout exceeded; try restarting transaction</a>
                                          <span class="text-muted">aigo</span>
      <a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a>
                                          <div>原文:http://www.cnblogs.com/freeliver54/archive/2010/09/30/1839042.html 
        
      原因是你使用的InnoDB   表类型的时候, 
      默认参数:innodb_lock_wait_timeout设置锁等待的时间是50s, 
      因为有的锁等待超过了这个时间,所以抱错. 
        
      你可以把这个时间加长,或者优化存储</div>
                                      </li>
                                      <li><a href="/article/1069.htm"
                                             title="Socket编程 基本的聊天实现。" target="_blank">Socket编程 基本的聊天实现。</a>
                                          <span class="text-muted">alleni123</span>
      <a class="tag" taget="_blank" href="/search/socket/1.htm">socket</a>
                                          <div>public class Server
      {
      
      	//用来存储所有连接上来的客户
      	private List<ServerThread> clients;
      	
      	public static void main(String[] args)
      	{
      		Server s = new Server();
      		s.startServer(9988);
      	}
      
      	publi</div>
                                      </li>
                                      <li><a href="/article/1196.htm"
                                             title="多线程监听器事件模式(一个简单的例子)" target="_blank">多线程监听器事件模式(一个简单的例子)</a>
                                          <span class="text-muted">百合不是茶</span>
      <a class="tag" taget="_blank" href="/search/%E7%BA%BF%E7%A8%8B/1.htm">线程</a><a class="tag" taget="_blank" href="/search/%E7%9B%91%E5%90%AC%E6%A8%A1%E5%BC%8F/1.htm">监听模式</a>
                                          <div>    
      多线程的事件监听器模式 
        监听器时间模式经常与多线程使用,在多线程中如何知道我的线程正在执行那什么内容,可以通过时间监听器模式得到 
        
           创建多线程的事件监听器模式 思路: 
         1, 创建线程并启动,在创建线程的位置设置一个标记 
          2,创建队</div>
                                      </li>
                                      <li><a href="/article/1323.htm"
                                             title="spring InitializingBean接口" target="_blank">spring InitializingBean接口</a>
                                          <span class="text-muted">bijian1013</span>
      <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a>
                                          <div>spring的事务的TransactionTemplate,其源码如下: 
      public class TransactionTemplate extends DefaultTransactionDefinition implements TransactionOperations, InitializingBean{
       ...
      } 
      TransactionTemplate继承了DefaultT</div>
                                      </li>
                                      <li><a href="/article/1450.htm"
                                             title="Oracle中询表的权限被授予给了哪些用户" target="_blank">Oracle中询表的权限被授予给了哪些用户</a>
                                          <span class="text-muted">bijian1013</span>
      <a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/%E6%9D%83%E9%99%90/1.htm">权限</a>
                                          <div>        Oracle查询表将权限赋给了哪些用户的SQL,以备查用。 
      select t.table_name as "表名",
             t.grantee    as "被授权的属组",
             t.owner      as "对象所在的属组"</div>
                                      </li>
                                      <li><a href="/article/1577.htm"
                                             title="【Struts2五】Struts2 参数传值" target="_blank">【Struts2五】Struts2 参数传值</a>
                                          <span class="text-muted">bit1129</span>
      <a class="tag" taget="_blank" href="/search/struts2/1.htm">struts2</a>
                                          <div>Struts2中参数传值的3种情况 
      1.请求参数绑定到Action的实例字段上 
      2.Action将值传递到转发的视图上 
      3.Action将值传递到重定向的视图上 
        一、请求参数绑定到Action的实例字段上以及Action将值传递到转发的视图上  
      Struts可以自动将请求URL中的请求参数或者表单提交的参数绑定到Action定义的实例字段上,绑定的规则使用ognl表达式语言</div>
                                      </li>
                                      <li><a href="/article/1704.htm"
                                             title="【Kafka十四】关于auto.offset.reset[Q/A]" target="_blank">【Kafka十四】关于auto.offset.reset[Q/A]</a>
                                          <span class="text-muted">bit1129</span>
      <a class="tag" taget="_blank" href="/search/kafka/1.htm">kafka</a>
                                          <div>I got serveral questions about  auto.offset.reset. This configuration parameter governs how  consumer read the message from  Kafka when  there is no initial offset in ZooKeeper or </div>
                                      </li>
                                      <li><a href="/article/1831.htm"
                                             title="nginx gzip压缩配置" target="_blank">nginx gzip压缩配置</a>
                                          <span class="text-muted">ronin47</span>
      <a class="tag" taget="_blank" href="/search/nginx+gzip+%E5%8E%8B%E7%BC%A9%E8%8C%83%E4%BE%8B/1.htm">nginx gzip 压缩范例</a>
                                          <div>nginx gzip压缩配置   更多 
      0      
       nginx      
       gzip      
       配置         
      随着nginx的发展,越来越多的网站使用nginx,因此nginx的优化变得越来越重要,今天我们来看看nginx的gzip压缩到底是怎么压缩的呢? 
      gzip(GNU-ZIP)是一种压缩技术。经过gzip压缩后页面大小可以变为原来的30%甚至更小,这样,用</div>
                                      </li>
                                      <li><a href="/article/1958.htm"
                                             title="java-13.输入一个单向链表,输出该链表中倒数第 k 个节点" target="_blank">java-13.输入一个单向链表,输出该链表中倒数第 k 个节点</a>
                                          <span class="text-muted">bylijinnan</span>
      <a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                                          <div>two cursors. 
      Make the first cursor go K steps first. 
       
       
      
      /*
      	 * 第 13 题:题目:输入一个单向链表,输出该链表中倒数第 k 个节点
      	 */
      	public void displayKthItemsBackWard(ListNode head,int k){
      		ListNode p1=head,p2=head;
      </div>
                                      </li>
                                      <li><a href="/article/2085.htm"
                                             title="Spring源码学习-JdbcTemplate queryForObject" target="_blank">Spring源码学习-JdbcTemplate queryForObject</a>
                                          <span class="text-muted">bylijinnan</span>
      <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a>
                                          <div>JdbcTemplate中有两个可能会混淆的queryForObject方法: 
      1. 
      Object queryForObject(String sql, Object[] args, Class requiredType) 
      2. 
      Object queryForObject(String sql, Object[] args, RowMapper rowMapper) 
       
      第1个方法是只查</div>
                                      </li>
                                      <li><a href="/article/2212.htm"
                                             title="[冰川时代]在冰川时代,我们需要什么样的技术?" target="_blank">[冰川时代]在冰川时代,我们需要什么样的技术?</a>
                                          <span class="text-muted">comsci</span>
      <a class="tag" taget="_blank" href="/search/%E6%8A%80%E6%9C%AF/1.htm">技术</a>
                                          <div> 
       
           看美国那边的气候情况....我有个感觉...是不是要进入小冰期了? 
       
           那么在小冰期里面...我们的户外活动肯定会出现很多问题...在室内呆着的情况会非常多...怎么在室内呆着而不发闷...怎么用最低的电力保证室内的温度.....这都需要技术手段... 
       
        &nb</div>
                                      </li>
                                      <li><a href="/article/2339.htm"
                                             title="js 获取浏览器型号" target="_blank">js 获取浏览器型号</a>
                                          <span class="text-muted">cuityang</span>
      <a class="tag" taget="_blank" href="/search/js/1.htm">js</a><a class="tag" taget="_blank" href="/search/%E6%B5%8F%E8%A7%88%E5%99%A8/1.htm">浏览器</a>
                                          <div>根据浏览器获取iphone和apk的下载地址 
       
      <!DOCTYPE html> 
      <html> 
      <head> 
          <meta charset="utf-8" content="text/html"/> 
          <meta name=</div>
                                      </li>
                                      <li><a href="/article/2466.htm"
                                             title="C# socks5详解 转" target="_blank">C# socks5详解 转</a>
                                          <span class="text-muted">dalan_123</span>
      <a class="tag" taget="_blank" href="/search/socket/1.htm">socket</a><a class="tag" taget="_blank" href="/search/C%23/1.htm">C#</a>
                                          <div>http://www.cnblogs.com/zhujiechang/archive/2008/10/21/1316308.html    这里主要讲的是用.NET实现基于Socket5下面的代理协议进行客户端的通讯,Socket4的实现是类似的,注意的事,这里不是讲用C#实现一个代理服务器,因为实现一个代理服务器需要实现很多协议,头大,而且现在市面上有很多现成的代理服务器用,性能又好,</div>
                                      </li>
                                      <li><a href="/article/2593.htm"
                                             title="运维 Centos问题汇总" target="_blank">运维 Centos问题汇总</a>
                                          <span class="text-muted">dcj3sjt126com</span>
      <a class="tag" taget="_blank" href="/search/%E4%BA%91%E4%B8%BB%E6%9C%BA/1.htm">云主机</a>
                                          <div>一、sh 脚本不执行的原因 
      sh脚本不执行的原因 只有2个 
      1.权限不够 
      2.sh脚本里路径没写完整。 
        
      二、解决You have new mail in /var/spool/mail/root 
      修改/usr/share/logwatch/default.conf/logwatch.conf配置文件 
      MailTo = 
      MailFrom 
        
      三、查询连接数</div>
                                      </li>
                                      <li><a href="/article/2720.htm"
                                             title="Yii防注入攻击笔记" target="_blank">Yii防注入攻击笔记</a>
                                          <span class="text-muted">dcj3sjt126com</span>
      <a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a><a class="tag" taget="_blank" href="/search/WEB%E5%AE%89%E5%85%A8/1.htm">WEB安全</a><a class="tag" taget="_blank" href="/search/yii/1.htm">yii</a>
                                          <div>网站表单有注入漏洞须对所有用户输入的内容进行个过滤和检查,可以使用正则表达式或者直接输入字符判断,大部分是只允许输入字母和数字的,其它字符度不允许;对于内容复杂表单的内容,应该对html和script的符号进行转义替换:尤其是<,>,',"",&这几个符号  这里有个转义对照表: 
      http://blog.csdn.net/xinzhu1990/articl</div>
                                      </li>
                                      <li><a href="/article/2847.htm"
                                             title="MongoDB简介[一]" target="_blank">MongoDB简介[一]</a>
                                          <span class="text-muted">eksliang</span>
      <a class="tag" taget="_blank" href="/search/mongodb/1.htm">mongodb</a><a class="tag" taget="_blank" href="/search/MongoDB%E7%AE%80%E4%BB%8B/1.htm">MongoDB简介</a>
                                          <div>MongoDB简介 
      转载请出自出处:http://eksliang.iteye.com/blog/2173288 1.1易于使用 
             MongoDB是一个面向文档的数据库,而不是关系型数据库。与关系型数据库相比,面向文档的数据库不再有行的概念,取而代之的是更为灵活的“文档”模型。 
             另外,不</div>
                                      </li>
                                      <li><a href="/article/2974.htm"
                                             title="zookeeper windows 入门安装和测试" target="_blank">zookeeper windows 入门安装和测试</a>
                                          <span class="text-muted">greemranqq</span>
      <a class="tag" taget="_blank" href="/search/zookeeper/1.htm">zookeeper</a><a class="tag" taget="_blank" href="/search/%E5%AE%89%E8%A3%85/1.htm">安装</a><a class="tag" taget="_blank" href="/search/%E5%88%86%E5%B8%83%E5%BC%8F/1.htm">分布式</a>
                                          <div>一、序言 
            以下是我对zookeeper 的一些理解:      zookeeper 作为一个服务注册信息存储的管理工具,好吧,这样说得很抽象,我们举个“栗子”。 
            栗子1号: 
            假设我是一家KTV的老板,我同时拥有5家KTV,我肯定得时刻监视</div>
                                      </li>
                                      <li><a href="/article/3101.htm"
                                             title="Spring之使用事务缘由(2-注解实现)" target="_blank">Spring之使用事务缘由(2-注解实现)</a>
                                          <span class="text-muted">ihuning</span>
      <a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a>
                                          <div>  
      Spring事务注解实现 
        
      1. 依赖包: 
          1.1 spring包: 
                spring-beans-4.0.0.RELEASE.jar 
                spring-context-4.0.0.</div>
                                      </li>
                                      <li><a href="/article/3228.htm"
                                             title="iOS App Launch Option" target="_blank">iOS App Launch Option</a>
                                          <span class="text-muted">啸笑天</span>
      <a class="tag" taget="_blank" href="/search/option/1.htm">option</a>
                                          <div>iOS 程序启动时总会调用application:didFinishLaunchingWithOptions:,其中第二个参数launchOptions为NSDictionary类型的对象,里面存储有此程序启动的原因。 
        
      launchOptions中的可能键值见UIApplication Class Reference的Launch Options Keys节 。 
      1、若用户直接</div>
                                      </li>
                                      <li><a href="/article/3355.htm"
                                             title="jdk与jre的区别(_)" target="_blank">jdk与jre的区别(_)</a>
                                          <span class="text-muted">macroli</span>
      <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/jvm/1.htm">jvm</a><a class="tag" taget="_blank" href="/search/jdk/1.htm">jdk</a>
                                          <div>简单的说JDK是面向开发人员使用的SDK,它提供了Java的开发环境和运行环境。SDK是Software Development Kit 一般指软件开发包,可以包括函数库、编译程序等。  
      JDK就是Java Development Kit JRE是Java Runtime Enviroment是指Java的运行环境,是面向Java程序的使用者,而不是开发者。 如果安装了JDK,会发同你</div>
                                      </li>
                                      <li><a href="/article/3482.htm"
                                             title="Updates were rejected because the tip of your current branch is behind" target="_blank">Updates were rejected because the tip of your current branch is behind</a>
                                          <span class="text-muted">qiaolevip</span>
      <a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0%E6%B0%B8%E6%97%A0%E6%AD%A2%E5%A2%83/1.htm">学习永无止境</a><a class="tag" taget="_blank" href="/search/%E6%AF%8F%E5%A4%A9%E8%BF%9B%E6%AD%A5%E4%B8%80%E7%82%B9%E7%82%B9/1.htm">每天进步一点点</a><a class="tag" taget="_blank" href="/search/%E4%BC%97%E8%A7%82%E5%8D%83%E8%B1%A1/1.htm">众观千象</a><a class="tag" taget="_blank" href="/search/git/1.htm">git</a>
                                          <div>$ git push joe prod-2295-1
      
      To git@git.dianrong.com:joe.le/dr-frontend.git
       ! [rejected]        prod-2295-1 -> prod-2295-1 (non-fast-forward)
      error: failed to push some refs to 'git@git.dianron</div>
                                      </li>
                                      <li><a href="/article/3609.htm"
                                             title="[一起学Hive]之十四-Hive的元数据表结构详解" target="_blank">[一起学Hive]之十四-Hive的元数据表结构详解</a>
                                          <span class="text-muted">superlxw1234</span>
      <a class="tag" taget="_blank" href="/search/hive/1.htm">hive</a><a class="tag" taget="_blank" href="/search/hive%E5%85%83%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">hive元数据结构</a>
                                          <div>关键字:Hive元数据、Hive元数据表结构 
        
      之前在 “[一起学Hive]之一–Hive概述,Hive是什么”中介绍过,Hive自己维护了一套元数据,用户通过HQL查询时候,Hive首先需要结合元数据,将HQL翻译成MapReduce去执行。 
      本文介绍一下Hive元数据中重要的一些表结构及用途,以Hive0.13为例。 
        
      文章最后面,会以一个示例来全面了解一下,</div>
                                      </li>
                                      <li><a href="/article/3736.htm"
                                             title="Spring 3.2.14,4.1.7,4.2.RC2发布" target="_blank">Spring 3.2.14,4.1.7,4.2.RC2发布</a>
                                          <span class="text-muted">wiselyman</span>
      <a class="tag" taget="_blank" href="/search/Spring+3/1.htm">Spring 3</a>
                                          <div>  
      Spring 3.2.14、4.1.7及4.2.RC2于6月30日发布。 
        
      其中Spring 3.2.1是一个维护版本(维护周期到2016-12-31截止),后续会继续根据需求和bug发布维护版本。此时,Spring官方强烈建议升级Spring框架至4.1.7 或者将要发布的4.2 。 
        
      其中Spring 4.1.7主要包含这些更新内容。 </div>
                                      </li>
                      </ul>
                  </div>
              </div>
          </div>
      
      <div>
          <div class="container">
              <div class="indexes">
                  <strong>按字母分类:</strong>
                  <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a
                      href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a
                      href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a
                      href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a
                      href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a
                      href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a
                      href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a
                      href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a
                      href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a>
              </div>
          </div>
      </div>
      <footer id="footer" class="mb30 mt30">
          <div class="container">
              <div class="footBglm">
                  <a target="_blank" href="/">首页</a> -
                  <a target="_blank" href="/custom/about.htm">关于我们</a> -
                  <a target="_blank" href="/search/Java/1.htm">站内搜索</a> -
                  <a target="_blank" href="/sitemap.txt">Sitemap</a> -
                  <a target="_blank" href="/custom/delete.htm">侵权投诉</a>
              </div>
              <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved.
      <!--            <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>-->
              </div>
          </div>
      </footer>
      <!-- 代码高亮 -->
      <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script>
      <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script>
      <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script>
      <link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/>
      <script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script>
      
      
      
      
      
      </body>
      
      </html>