加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

scrapy框架

发布时间:2020-12-17 00:01:35 所属栏目:Python 来源:网络整理
导读:一、性能相关 response = url_list = [ , url fetch_async(url) concurrent.futures span style="color: #0000ff"def span style="color: #000000" fetch_async(url): response =span style="color: #000000" requests.get(url) span style="color: #0000ff"

一、性能相关

response = url_list = [, url fetch_async(url)
concurrent.futures <span style="color: #0000ff">def<span style="color: #000000"> fetch_async(url):
response
=<span style="color: #000000"> requests.get(url)
<span style="color: #0000ff">return
<span style="color: #000000"> response

url_list = [<span style="color: #800000">'<span style="color: #800000">http://www.github.com<span style="color: #800000">',<span style="color: #800000">'<span style="color: #800000">http://www.bing.com<span style="color: #800000">'<span style="color: #000000">]
pool = ThreadPoolExecutor(5<span style="color: #000000">)
<span style="color: #0000ff">for url <span style="color: #0000ff">in<span style="color: #000000"> url_list:
pool.submit(fetch_async,url)
pool.shutdown(wait=True)

concurrent.futures <span style="color: #0000ff">def<span style="color: #000000"> fetch_async(url):
response
=<span style="color: #000000"> requests.get(url)
<span style="color: #0000ff">return
<span style="color: #000000"> response

<span style="color: #0000ff">def<span style="color: #000000"> callback(future):
<span style="color: #0000ff">print<span style="color: #000000">(future.result())

url_list = [<span style="color: #800000">'<span style="color: #800000">http://www.github.com<span style="color: #800000">',<span style="color: #800000">'<span style="color: #800000">http://www.bing.com<span style="color: #800000">'<span style="color: #000000">]
pool = ThreadPoolExecutor(5<span style="color: #000000">)
<span style="color: #0000ff">for url <span style="color: #0000ff">in<span style="color: #000000"> url_list:
v =<span style="color: #000000"> pool.submit(fetch_async,url)
v.add_done_callback(callback)
pool.shutdown(wait=True)

concurrent.futures <span style="color: #0000ff">def<span style="color: #000000"> fetch_async(url):
response
=<span style="color: #000000"> requests.get(url)
<span style="color: #0000ff">return
<span style="color: #000000"> response

url_list = [<span style="color: #800000">'<span style="color: #800000">http://www.github.com<span style="color: #800000">',<span style="color: #800000">'<span style="color: #800000">http://www.bing.com<span style="color: #800000">'<span style="color: #000000">]
pool = ProcessPoolExecutor(5<span style="color: #000000">)
<span style="color: #0000ff">for url <span style="color: #0000ff">in<span style="color: #000000"> url_list:
pool.submit(fetch_async,url)
pool.shutdown(wait=True)

concurrent.futures <span style="color: #0000ff">def<span style="color: #000000"> fetch_async(url):
response
=<span style="color: #000000"> requests.get(url)
<span style="color: #0000ff">return
<span style="color: #000000"> response

<span style="color: #0000ff">def<span style="color: #000000"> callback(future):
<span style="color: #0000ff">print<span style="color: #000000">(future.result())

url_list = [<span style="color: #800000">'<span style="color: #800000">http://www.github.com<span style="color: #800000">',<span style="color: #800000">'<span style="color: #800000">http://www.bing.com<span style="color: #800000">'<span style="color: #000000">]
pool = ProcessPoolExecutor(5<span style="color: #000000">)
<span style="color: #0000ff">for url <span style="color: #0000ff">in<span style="color: #000000"> url_list:
v =<span style="color: #000000"> pool.submit(fetch_async,url)
v.add_done_callback(callback)
pool.shutdown(wait=True)

?二、Scrapy

1、Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中。其最初是为了页面抓取 (更确切来说,网络抓取 )所设计的, 也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。

2、scrapy组件

  <1>引擎(Scrapy)

    用来处理整个系统的数据流处理,触发事务(框架核心)

  <2>调度器(Scheduler)

    用来接受引擎发过来的请求,压入队列中,并在引擎再次请求的时候返回. 可以想像成一个URL(抓取网页的网址或者说是链接)的优先队列,
由它来决定下一个要抓取的网址是什么,同时去除重复的网址

  <3>下载器(Downloader)

    用于下载网页内容,并将网页内容返回给蜘蛛(Scrapy下载器是建立在twisted这个高效的异步模型上的)

  <4>爬虫(Spiders)

    爬虫是主要干活的,用于从特定的网页中提取自己需要的信息,即所谓的实体(Item)。用户也可以从中提取出链接,让Scrapy继续抓取下一个页面

  <5>项目管道(Pipeline)

    负责处理爬虫从网页中抽取的实体,主要的功能是持久化实体、验证实体的有效性、清除不需要的信息。当页面被爬虫解析后,
将被发送到项目管道,并经过几个特定的次序处理数据。

  <6>下载器中间件(Downloader Middlewares)

    位于Scrapy引擎和下载器之间的框架,主要是处理Scrapy引擎与下载器之间的请求及响应。

  <7>爬虫中间件(Spider Middlewares)

    介于Scrapy引擎和爬虫之间的框架,主要工作是处理蜘蛛的响应输入和请求输出。

  <8>调度中间件(Scheduler Middewares)

    介于Scrapy引擎和调度之间的中间件,从Scrapy引擎发送到调度的请求和响应

3、scrapy运行流程

  • 引擎从调度器中取出一个链接(URL)用于接下来的抓取

  • 引擎把URL封装成一个请求(Request)传给下载器

  • 下载器把资源下载下来,并封装成应答包(Response)

  • 爬虫解析Response

  • 解析出实体(Item),则交给实体管道进行进一步的处理

  • 解析出的是链接(URL),则把URL交给调度器等待抓取

4、scrapy使用

  1、基本命令

1-2. scrapy genspider [-t template]
-<span style="color: #000000"> 创建爬虫应用
如:
scrapy gensipider
-<span style="color: #000000">t basic oldboy oldboy.com
scrapy gensipider -<span style="color: #000000">t xmlfeed autohome autohome.com.cn
PS:
查看所有命令:scrapy gensipider -<span style="color: #000000">l
查看模板命令:scrapy gensipider -<span style="color: #000000">d 模板名称

3<span style="color: #000000">. scrapy list
-<span style="color: #000000"> 展示爬虫应用列表

4<span style="color: #000000">. scrapy crawl 爬虫应用名称
- 运行单独爬虫应用

  2、项目结构以及爬虫应用简介

project_name/ project_name/ spiders/ 爬虫3.py

文件说明:

  • scrapy.cfg ?项目的主配置信息。(真正爬虫相关的配置信息在settings.py文件中)
  • items.py ? ?设置数据存储模板,用于结构化数据,如:Django的Model
  • pipelines ? ?数据处理行为,如:一般结构化的数据持久化
  • settings.py 配置文件,如:递归的层数、并发数,延迟下载等
  • spiders ? ? ?爬虫目录,如:创建文件,编写爬虫规则
scrapy.selector scrapy.http.request <span style="color: #0000ff">class<span style="color: #000000"> DigSpider(scrapy.Spider):
<span style="color: #008000">#
<span style="color: #008000"> 爬虫应用的名称,通过此名称启动爬虫命令

name = <span style="color: #800000">"
<span style="color: #800000">dig
<span style="color: #800000">"

<span style="color: #008000"&gt;#</span><span style="color: #008000"&gt; 允许的域名</span>
allowed_domains = [<span style="color: #800000"&gt;"</span><span style="color: #800000"&gt;chouti.com</span><span style="color: #800000"&gt;"</span><span style="color: #000000"&gt;]

</span><span style="color: #008000"&gt;#</span><span style="color: #008000"&gt; 起始URL</span>
start_urls =<span style="color: #000000"&gt; [
    </span><span style="color: #800000"&gt;'</span><span style="color: #800000"&gt;http://dig.chouti.com/</span><span style="color: #800000"&gt;'</span><span style="color: #000000"&gt;,]

has_request_set </span>=<span style="color: #000000"&gt; {}

</span><span style="color: #0000ff"&gt;def</span><span style="color: #000000"&gt; parse(self,response):
    </span><span style="color: #0000ff"&gt;print</span><span style="color: #000000"&gt;(response.url)

    hxs </span>=<span style="color: #000000"&gt; HtmlXPathSelector(response)
    page_list </span>= hxs.select(<span style="color: #800000"&gt;'</span><span style="color: #800000"&gt;//div[@id="dig_lcpage"]//a[re:test(@href,"/all/hot/recent/d+")]/@href</span><span style="color: #800000"&gt;'</span><span style="color: #000000"&gt;).extract()
    </span><span style="color: #0000ff"&gt;for</span> page <span style="color: #0000ff"&gt;in</span><span style="color: #000000"&gt; page_list:
        page_url </span>= <span style="color: #800000"&gt;'</span><span style="color: #800000"&gt;http://dig.chouti.com%s</span><span style="color: #800000"&gt;'</span> %<span style="color: #000000"&gt; page
        key </span>=<span style="color: #000000"&gt; self.md5(page_url)
        </span><span style="color: #0000ff"&gt;if</span> key <span style="color: #0000ff"&gt;in</span><span style="color: #000000"&gt; self.has_request_set:
            </span><span style="color: #0000ff"&gt;pass</span>
        <span style="color: #0000ff"&gt;else</span><span style="color: #000000"&gt;:
            self.has_request_set[key] </span>=<span style="color: #000000"&gt; page_url
            obj </span>= Request(url=page_url,method=<span style="color: #800000"&gt;'</span><span style="color: #800000"&gt;GET</span><span style="color: #800000"&gt;'</span>,callback=<span style="color: #000000"&gt;self.parse)
            </span><span style="color: #0000ff"&gt;yield</span><span style="color: #000000"&gt; obj

@staticmethod
</span><span style="color: #0000ff"&gt;def</span><span style="color: #000000"&gt; md5(val):
    </span><span style="color: #0000ff"&gt;import</span><span style="color: #000000"&gt; hashlib
    ha </span>=<span style="color: #000000"&gt; hashlib.md5()
    ha.update(bytes(val,encoding</span>=<span style="color: #800000"&gt;'</span><span style="color: #800000"&gt;utf-8</span><span style="color: #800000"&gt;'</span><span style="color: #000000"&gt;))
    key </span>=<span style="color: #000000"&gt; ha.hexdigest()
    </span><span style="color: #0000ff"&gt;return</span> key</pre>

执行此爬虫文件,则在终端进入项目目录执行如下命令:

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读