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/1835490218845761536.htm"
                                 title="Python爬虫解析工具之xpath使用详解" target="_blank">Python爬虫解析工具之xpath使用详解</a>
                              <span class="text-muted">eqa11</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爬虫解析工具之xpath使用详解一、引言二、环境准备1、插件安装2、依赖库安装三、xpath语法详解1、路径表达式2、通配符3、谓语4、常用函数四、xpath在Python代码中的使用1、文档树的创建2、使用xpath表达式3、获取元素内容和属性五、总结Python爬虫解析工具之xpath使用详解一、引言在Python爬虫开发中,数据提取是一个至关重要的环节。xpath作为一门</div>
                          </li>
                          <li><a href="/article/1835483159630802944.htm"
                                 title="nosql数据库技术与应用知识点" target="_blank">nosql数据库技术与应用知识点</a>
                              <span class="text-muted">皆过客,揽星河</span>
      <a class="tag" taget="_blank" href="/search/NoSQL/1.htm">NoSQL</a><a class="tag" taget="_blank" href="/search/nosql/1.htm">nosql</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/%E5%A4%A7%E6%95%B0%E6%8D%AE/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%E7%BB%93%E6%9E%84/1.htm">数据结构</a><a class="tag" taget="_blank" href="/search/%E9%9D%9E%E5%85%B3%E7%B3%BB%E5%9E%8B%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">非关系型数据库</a>
                              <div>Nosql知识回顾大数据处理流程数据采集(flume、爬虫、传感器)数据存储(本门课程NoSQL所处的阶段)Hdfs、MongoDB、HBase等数据清洗(入仓)Hive等数据处理、分析(Spark、Flink等)数据可视化数据挖掘、机器学习应用(Python、SparkMLlib等)大数据时代存储的挑战(三高)高并发(同一时间很多人访问)高扩展(要求随时根据需求扩展存储)高效率(要求读写速度快)</div>
                          </li>
                          <li><a href="/article/1835454921990828032.htm"
                                 title="Java爬虫框架(一)--架构设计" target="_blank">Java爬虫框架(一)--架构设计</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/%E6%A1%86%E6%9E%B6/1.htm">框架</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E4%BB%BB%E5%8A%A1/1.htm">任务</a><a class="tag" taget="_blank" href="/search/html%E8%A7%A3%E6%9E%90%E5%99%A8/1.htm">html解析器</a><a class="tag" taget="_blank" href="/search/%E5%AD%98%E5%82%A8/1.htm">存储</a><a class="tag" taget="_blank" href="/search/%E7%94%B5%E5%AD%90%E5%95%86%E5%8A%A1/1.htm">电子商务</a>
                              <div>一、架构图那里搜网络爬虫框架主要针对电子商务网站进行数据爬取,分析,存储,索引。爬虫:爬虫负责爬取,解析,处理电子商务网站的网页的内容数据库:存储商品信息索引:商品的全文搜索索引Task队列:需要爬取的网页列表Visited表:已经爬取过的网页列表爬虫监控平台:web平台可以启动,停止爬虫,管理爬虫,task队列,visited表。二、爬虫1.流程1)Scheduler启动爬虫器,TaskMast</div>
                          </li>
                          <li><a href="/article/1835454543471669248.htm"
                                 title="Java:爬虫框架" target="_blank">Java:爬虫框架</a>
                              <span class="text-muted">dingcho</span>
      <a class="tag" taget="_blank" href="/search/Java/1.htm">Java</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a>
                              <div>一、ApacheNutch2【参考地址】Nutch是一个开源Java实现的搜索引擎。它提供了我们运行自己的搜索引擎所需的全部工具。包括全文搜索和Web爬虫。Nutch致力于让每个人能很容易,同时花费很少就可以配置世界一流的Web搜索引擎.为了完成这一宏伟的目标,Nutch必须能够做到:每个月取几十亿网页为这些网页维护一个索引对索引文件进行每秒上千次的搜索提供高质量的搜索结果简单来说Nutch支持分</div>
                          </li>
                          <li><a href="/article/1835438028009598976.htm"
                                 title="WebMagic:强大的Java爬虫框架解析与实战" target="_blank">WebMagic:强大的Java爬虫框架解析与实战</a>
                              <span class="text-muted">Aaron_945</span>
      <a class="tag" taget="_blank" href="/search/Java/1.htm">Java</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</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>文章目录引言官网链接WebMagic原理概述基础使用1.添加依赖2.编写PageProcessor高级使用1.自定义Pipeline2.分布式抓取优点结论引言在大数据时代,网络爬虫作为数据收集的重要工具,扮演着不可或缺的角色。Java作为一门广泛使用的编程语言,在爬虫开发领域也有其独特的优势。WebMagic是一个开源的Java爬虫框架,它提供了简单灵活的API,支持多线程、分布式抓取,以及丰富的</div>
                          </li>
                          <li><a href="/article/1835435506645692416.htm"
                                 title="00. 这里整理了最全的爬虫框架(Java + Python)" target="_blank">00. 这里整理了最全的爬虫框架(Java + Python)</a>
                              <span class="text-muted">有一只柴犬</span>
      <a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB%E7%B3%BB%E5%88%97/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/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a>
                              <div>目录1、前言2、什么是网络爬虫3、常见的爬虫框架3.1、java框架3.1.1、WebMagic3.1.2、Jsoup3.1.3、HttpClient3.1.4、Crawler4j3.1.5、HtmlUnit3.1.6、Selenium3.2、Python框架3.2.1、Scrapy3.2.2、BeautifulSoup+Requests3.2.3、Selenium3.2.4、PyQuery3.2</div>
                          </li>
                          <li><a href="/article/1835412560413814784.htm"
                                 title="python爬取微信小程序数据,python爬取小程序数据" target="_blank">python爬取微信小程序数据,python爬取小程序数据</a>
                              <span class="text-muted">2301_81900439</span>
      <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a>
                              <div>大家好,小编来为大家解答以下问题,python爬取微信小程序数据,python爬取小程序数据,现在让我们一起来看看吧!Python爬虫系列之微信小程序实战基于Scrapy爬虫框架实现对微信小程序数据的爬取首先,你得需要安装抓包工具,这里推荐使用Charles,至于怎么使用后期有时间我会出一个事例最重要的步骤之一就是分析接口,理清楚每一个接口功能,然后连接起来形成接口串思路,再通过Spider的回调</div>
                          </li>
                          <li><a href="/article/1835347005522669568.htm"
                                 title="大模型训练数据库Common Crawl" target="_blank">大模型训练数据库Common Crawl</a>
                              <span class="text-muted">WindyChanChan</span>
      <a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E9%9B%86/1.htm">数据集</a><a class="tag" taget="_blank" href="/search/%E8%AF%AD%E8%A8%80%E6%A8%A1%E5%9E%8B/1.htm">语言模型</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a>
                              <div>CommonCrawl介绍‌‌CommonCrawl是一个非营利组织,致力于通过大规模分布式爬虫系统定期抓取整个Web并将其存储在一个可公开访问的数据库中。CommonCrawl的数据收集和处理过程包括使用Python开源爬虫工具收集全球范围内的网站数据,并将其上传到‌CommonCrawl基金会的数据仓库中。该项目从2008年开始,至今已经积累了大量的原始网页数据、元数据和文本提取数据。这些数据</div>
                          </li>
                          <li><a href="/article/1835342718067372032.htm"
                                 title="Python精选200Tips:121-125" target="_blank">Python精选200Tips:121-125</a>
                              <span class="text-muted">AnFany</span>
      <a class="tag" taget="_blank" href="/search/Python200%2BTips/1.htm">Python200+Tips</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%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                              <div>Spendyourtimeonself-improvement121Requests-简化的HTTP请求处理发送GET请求发送POST请求发送PUT请求发送DELETE请求会话管理处理超时文件上传122BeautifulSoup-网页解析和抓取解析HTML和XML文档查找单个标签查找多个标签使用CSS选择器查找标签提取文本修改文档内容删除标签处理XML文档123Scrapy-强大的网络爬虫框架示例</div>
                          </li>
                          <li><a href="/article/1835333520919195648.htm"
                                 title="爬虫技术抓取网站数据被限制怎么处理" target="_blank">爬虫技术抓取网站数据被限制怎么处理</a>
                              <span class="text-muted">Bearjumpingcandy</span>
      <a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a>
                              <div>爬虫技术用于抓取网站数据时,可能会遇到一些限制,常见的包括反爬机制、速率限制、IP封禁等。以下是应对这些情况的一些策略:尊重robots.txt:每个网站都有robots.txt文件,遵循其中的规定可以避免触犯网站的抓取规则。设置合理频率:控制爬虫请求的速度,通过添加延迟或使用代理服务器,减少对目标网站的压力。使用代理:获取并使用代理IP地址可以更换访问来源,降低被识别的可能性。模拟用户行为:使用</div>
                          </li>
                          <li><a href="/article/1835333267952332800.htm"
                                 title="网站推广爬虫" target="_blank">网站推广爬虫</a>
                              <span class="text-muted">Bearjumpingcandy</span>
      <a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a>
                              <div>网站推广爬虫是一种用于升网站曝光度和推广效果的工具。它通过自动化地访问和收集网站信息,从而实现对目标网站的广告、关键词、排名等数据进行分析和优化。以下是网站推广爬虫的一些介绍:数据收集:网站推广爬虫可以自动访问目标网站,并收集相关的数据,如网站流量、关键词排名、竞争对手信息等。这些数据可以帮助网站推广人员了解网站的现状和竞争环境,从而制定相应的推广策略。关键词优化:通过分析搜索引擎的关键词排名情况</div>
                          </li>
                          <li><a href="/article/1835333268375957504.htm"
                                 title="爬虫技术抓取网站数据" target="_blank">爬虫技术抓取网站数据</a>
                              <span class="text-muted">Bearjumpingcandy</span>
      <a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a>
                              <div>爬虫技术是一种自动化获取网站数据的技术,它可以模拟人类浏览器的行为,访问网页并提取所需的信息。以下是爬虫技术抓取网站数据的一般步骤:发起HTTP请求:爬虫首先会发送HTTP请求到目标网站,获取网页的内容。解析HTML:获取到网页内容后,爬虫会使用HTML解析器解析HTML代码,提取出需要的数据。数据提取:通过使用XPath、CSS选择器或正则表达式等工具,爬虫可以从HTML中提取出所需的数据,如文</div>
                          </li>
                          <li><a href="/article/1835333268858302464.htm"
                                 title="爬虫技术抓取网站数据" target="_blank">爬虫技术抓取网站数据</a>
                              <span class="text-muted">Bearjumpingcandy</span>
      <a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a>
                              <div>爬虫技术是指通过程序自动访问网页并提取数据的技术。一般来说,爬虫技术包含以下几个步骤:确定目标网站:确定需要抓取的网站,并了解其页面结构和数据特点。分析页面结构:分析网页的结构和源代码,找到需要抓取的数据在页面中的位置和标识。编写爬虫程序:使用编程语言(如Python)编写爬虫程序,实现对目标网站的自动访问和数据提取。处理抓取数据:对抓取到的数据进行清洗、去重、整合等处理,以便后续的分析和利用。爬</div>
                          </li>
                          <li><a href="/article/1835332888674004992.htm"
                                 title="爬虫之隧道代理:如何在爬虫中使用代理IP?" target="_blank">爬虫之隧道代理:如何在爬虫中使用代理IP?</a>
                              <span class="text-muted">2401_87251497</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/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C/1.htm">网络</a><a class="tag" taget="_blank" href="/search/tcp%2Fip/1.htm">tcp/ip</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE/1.htm">网络协议</a>
                              <div>在进行网络爬虫时,使用代理IP是一种常见的方式来绕过网站的反爬虫机制,提高爬取效率和数据质量。本文将详细介绍如何在爬虫中使用隧道代理,包括其原理、优势以及具体的实现方法。无论您是爬虫新手还是有经验的开发者,这篇文章都将为您提供实用的指导。什么是隧道代理?隧道代理是一种高级的代理技术,它通过创建一个加密的隧道,将数据从客户端传输到代理服务器,再由代理服务器转发到目标服务器。这样不仅可以隐藏客户端的真</div>
                          </li>
                          <li><a href="/article/1835288964056051712.htm"
                                 title="分享一个基于python的电子书数据采集与可视化分析 hadoop电子书数据分析与推荐系统 spark大数据毕设项目(源码、调试、LW、开题、PPT)" target="_blank">分享一个基于python的电子书数据采集与可视化分析 hadoop电子书数据分析与推荐系统 spark大数据毕设项目(源码、调试、LW、开题、PPT)</a>
                              <span class="text-muted">计算机源码社</span>
      <a class="tag" taget="_blank" href="/search/Python%E9%A1%B9%E7%9B%AE/1.htm">Python项目</a><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%E6%95%B0%E6%8D%AE/1.htm">大数据</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/hadoop/1.htm">hadoop</a><a class="tag" taget="_blank" href="/search/%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%AF%95%E4%B8%9A%E8%AE%BE%E8%AE%A1%E9%80%89%E9%A2%98/1.htm">计算机毕业设计选题</a><a class="tag" taget="_blank" href="/search/%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%AF%95%E4%B8%9A%E8%AE%BE%E8%AE%A1%E6%BA%90%E7%A0%81/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/spark%E6%AF%95%E8%AE%BE/1.htm">spark毕设</a>
                              <div>作者:计算机源码社个人简介:本人八年开发经验,擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等,大家有这一块的问题可以一起交流!学习资料、程序开发、技术解答、文档报告如需要源码,可以扫取文章下方二维码联系咨询Java项目微信小程序项目Android项目Python项目PHP项目ASP.NET项目Node.js项目选题推荐项目实战|p</div>
                          </li>
                          <li><a href="/article/1835270188086423552.htm"
                                 title="python抓取网页内容401应该用哪个库_python3使用requests模块爬取页面内容入门" target="_blank">python抓取网页内容401应该用哪个库_python3使用requests模块爬取页面内容入门</a>
                              <span class="text-muted">坂田月半</span>
      
                              <div>python的爬虫相关模块有很多,除了requests模块,再如urllib和pycurl以及tornado等。相比而言,requests模块是相对简单易上手的。通过文本,大家可以迅速学会使用python的requests模块爬取页码内容。1.Requests唯一的一个非转基因的PythonHTTP库,人类可以安全享用。官网:http://cn.python-requests.org/zh_CN/</div>
                          </li>
                          <li><a href="/article/1835257575277424640.htm"
                                 title="【Python爬虫】百度百科词条内容" target="_blank">【Python爬虫】百度百科词条内容</a>
                              <span class="text-muted">PokiFighting</span>
      <a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%A4%84%E7%90%86/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>词条内容我这里随便选取了一个链接,用的是FBI的词条importurllib.requestimporturllib.parsefromlxmlimportetreedefquery(url):headers={'user-agent':'Mozilla/5.0(WindowsNT6.1;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/80.</div>
                          </li>
                          <li><a href="/article/1835253670858551296.htm"
                                 title="爬虫和代理IP的关系" target="_blank">爬虫和代理IP的关系</a>
                              <span class="text-muted">xiaoxiongip666</span>
      <a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/tcp%2Fip/1.htm">tcp/ip</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a>
                              <div>爬虫和代理IP之间的关系是相互依存的。代理IP为爬虫提供了绕过IP限制、隐藏真实IP、提高访问速度等能力,使得爬虫能够更有效地进行数据抓取。然而,在使用时也需要注意合法性、稳定性、成本以及隐私保护等问题。</div>
                          </li>
                          <li><a href="/article/1835219887434330112.htm"
                                 title="python语言爬虫爬取歌曲程序代码" target="_blank">python语言爬虫爬取歌曲程序代码</a>
                              <span class="text-muted">EYYLTV</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/android/1.htm">android</a>
                              <div>importrequestssong_urls=[“http://music.163.com/song/media/outer/url?id=25795016.mp3”,“https://m703.music.126.net/20240915140140/670dfe5c0144991d4cb778d6662fd762/jd-musicrep-privatecloud-audio-public/o</div>
                          </li>
                          <li><a href="/article/1835219887958618112.htm"
                                 title="python语言爬虫爬取歌曲代码X" target="_blank">python语言爬虫爬取歌曲代码X</a>
                              <span class="text-muted">EYYLTV</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/java/1.htm">java</a>
                              <div>importrequestssong_urls=[“https://m804.music.126.net/20240915142147/4e01caa69abda60b165e185607805ee1/jdyyaac/obj/w5rDlsOJwrLDjj7CmsOj/30379084686/b56a/dbd5/39fc/792d87f5d7014bb78547ec3804eeaac5.m4a?au</div>
                          </li>
                          <li><a href="/article/1835198462984024064.htm"
                                 title="拼多多商家电话采集工具 爬虫教程分享" target="_blank">拼多多商家电话采集工具 爬虫教程分享</a>
                              <span class="text-muted">小电商达人</span>
      <a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a>
                              <div>以下是使用Python编写的拼多多商家电话采集爬虫教程:一、前期准备安装Python:从Python官方网站下载并安装最新版本的Python,安装过程中注意勾选将Python添加到系统路径选项。安装相关库:在命令提示符中运行以下命令来安装所需的库。pipinstallrequests:用于发送HTTP请求获取网页内容。pipinstallbeautifulsoup4:用于解析HTML页面。二、分析</div>
                          </li>
                          <li><a href="/article/1835157319500001280.htm"
                                 title="Python爬虫代理池" target="_blank">Python爬虫代理池</a>
                              <span class="text-muted">极客李华</span>
      <a class="tag" taget="_blank" href="/search/python%E6%8E%88%E8%AF%BE/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>
                              <div>Python爬虫代理池网络爬虫在数据采集和信息抓取方面起到了关键作用。然而,为了应对网站的反爬虫机制和保护爬虫的真实身份,使用代理池变得至关重要。1.代理池的基本概念:代理池是一组包含多个代理IP地址的集合。通过在爬虫中使用代理池,我们能够隐藏爬虫的真实IP地址,实现一定程度的匿名性。这有助于防止被目标网站封锁或限制访问频率。2.为何使用代理池:匿名性:代理池允许爬虫在请求目标网站时使用不同的IP</div>
                          </li>
                          <li><a href="/article/1835143079305244672.htm"
                                 title="大数据毕业设计hadoop+spark+hive知识图谱租房数据分析可视化大屏 租房推荐系统 58同城租房爬虫 房源推荐系统 房价预测系统 计算机毕业设计 机器学习 深度学习 人工智能" target="_blank">大数据毕业设计hadoop+spark+hive知识图谱租房数据分析可视化大屏 租房推荐系统 58同城租房爬虫 房源推荐系统 房价预测系统 计算机毕业设计 机器学习 深度学习 人工智能</a>
                              <span class="text-muted">2401_84572577</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/%E5%A4%A7%E6%95%B0%E6%8D%AE/1.htm">大数据</a><a class="tag" taget="_blank" href="/search/hadoop/1.htm">hadoop</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干货,对我来说这些东西确实已经用不到了,但对于准备自学Python的人来说,或许它就是一个宝藏,可以给你省去很多的时间和精力。别在网上瞎学了,我最近也做了一些资源的更新,只要你是我的粉丝,这期福利你都可拿走。我先来介绍一下这些东西怎么用,文末抱走。(1)Python所有方向的学习路线(</div>
                          </li>
                          <li><a href="/article/1835067814621310976.htm"
                                 title="10个高效的Python爬虫框架,你用过几个?" target="_blank">10个高效的Python爬虫框架,你用过几个?</a>
                              <span class="text-muted">进击的C语言</span>
      <a class="tag" taget="_blank" href="/search/python/1.htm">python</a>
                              <div>小型爬虫需求,requests库+bs4库就能解决;大型爬虫数据,尤其涉及异步抓取、内容管理及后续扩展等功能时,就需要用到爬虫框架了。下面介绍了10个爬虫框架,大家可以学习使用!1.Scrapyscrapy官网:https://scrapy.org/scrapy中文文档:https://www.osgeo.cn/scrapy/intro/oScrapy是一个为了爬取网站数据,提取结构性数据而编写的</div>
                          </li>
                          <li><a href="/article/1835007168928116736.htm"
                                 title="python爬虫(5)之CSDN" target="_blank">python爬虫(5)之CSDN</a>
                              <span class="text-muted">It is a deal️</span>
      <a class="tag" taget="_blank" href="/search/%E5%B0%8F%E9%A1%B9%E7%9B%AE/1.htm">小项目</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/json/1.htm">json</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a>
                              <div>CSDN的爬虫相对于doubatop250更加简单,一般只需要title和url即可下面是相关的代码:#爬虫之csdn#分析urlhttps://www.csdn.net/api/articles?type=more&category=python&shown_offset=0(firstpage)#https://www.csdn.net/api/articles?type=more&categ</div>
                          </li>
                          <li><a href="/article/1835005152646492160.htm"
                                 title="python学习第七节:正则表达式" target="_blank">python学习第七节:正则表达式</a>
                              <span class="text-muted">一只会敲代码的小灰灰</span>
      <a class="tag" taget="_blank" href="/search/python%E5%AD%A6%E4%B9%A0/1.htm">python学习</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/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/1.htm">正则表达式</a>
                              <div>python学习第七节:正则表达式正则表达式基本上在所有开发语言中都会使用到,在python中尤为重要。当我们使用python开发爬虫程序将目标网页扒下来之后我们要从网页中解析出我们想要的信息,这个时候就需要正则表达式去进行匹配。importrere的常量re模块中有9个常量,常量的值都是int类型!(知道就行)修饰符描述re.l使匹配对大小写不敏感re.L做本地化识别(locale-aware)</div>
                          </li>
                          <li><a href="/article/1834965554214039552.htm"
                                 title="分布式框架Celery七(Django-Celery-Flower实现异步和定时爬虫及其监控邮件告警)" target="_blank">分布式框架Celery七(Django-Celery-Flower实现异步和定时爬虫及其监控邮件告警)</a>
                              <span class="text-muted">yjjpp2301</span>
      <a class="tag" taget="_blank" href="/search/Celery/1.htm">Celery</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/django/1.htm">django</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a>
                              <div>Django中集成方式安装模块pipinstallDjango==3.2.22pipinstallcelerypipinstallredispipinstalleventlet#在windows环境下需要安装eventlet包-----------pipinstalldjango-celery-beatpipinstalldjango-celery-resultspipinstalldjango-</div>
                          </li>
                          <li><a href="/article/1834960888273137664.htm"
                                 title="生产者消费者模式_Labview基础之生产者消费者设计模式(事件)" target="_blank">生产者消费者模式_Labview基础之生产者消费者设计模式(事件)</a>
                              <span class="text-muted">weixin_39532699</span>
      <a class="tag" taget="_blank" href="/search/%E7%94%9F%E4%BA%A7%E8%80%85%E6%B6%88%E8%B4%B9%E8%80%85%E6%A8%A1%E5%BC%8F/1.htm">生产者消费者模式</a>
                              <div>1绪论近期,开了一个QQ群,刚开始的目的也是想多拉写软件相关的大神,有问题的时候也可以交流交流。记得当时有个软件在写的时候遇到了一个棘手的问题,outlook邮箱配置账户密码的问题,到现在也没解决,算了,也不是很迫切。2000人群就留在那里爬虫发单吧!建群以后才发现,原来这一块的小白还挺多,总结起来就一个原因:做这个软件的大多数都不是软件出生,都是因为临时要搭建一个上位机平台,匆匆入门......</div>
                          </li>
                          <li><a href="/article/1834943236649611264.htm"
                                 title="Python——爬虫" target="_blank">Python——爬虫</a>
                              <span class="text-muted">星和月</span>
      <a class="tag" taget="_blank" href="/search/python/1.htm">python</a>
                              <div>当编写一个Python爬虫时,你可以使用BeautifulSoup库来解析网页内容,使用requests库来获取网页的HTML代码。下面是一个简单的示例,演示了如何获取并解析网页内容:importrequestsfrombs4importBeautifulSoup#发送HTTP请求获取网页内容url='https://www.example.com'#要爬取的网页的URLresponse=requ</div>
                          </li>
                          <li><a href="/article/1834807218839580672.htm"
                                 title="Python数据分析之股票信息可视化实现matplotlib" target="_blank">Python数据分析之股票信息可视化实现matplotlib</a>
                              <span class="text-muted">Blogfish</span>
      <a class="tag" taget="_blank" href="/search/Python3/1.htm">Python3</a><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/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%8F%AF%E8%A7%86%E5%8C%96/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>今天学习爬虫技术数据分析对于股票信息的分析及结果呈现,目标是实现对股票信息的爬取并对数据整理后,生成近期成交量折线图。首先,做这个案例一定要有一个明确的思路。知道要干啥,知道用哪些知识,有些方法我也记不住百度下知识库很强大,肯定有答案。有思路以后准备对数据处理,就是几个方法使用了。接口地址参考:Tushare数据涉及知识库:tushare-一个财经数据开放接口;pandas-实现将数据整理为表格,</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>