Scrapy基本使用

wusir

Twisted下载

Twisted安装不成功解决办法:把Twisted-17.1.0-cp36-cp36m-win_amd64.whl改为Twisted-17.1.0-py36-none-any.whl然后再进行安装。

Scrapy是一个大而全的爬虫组件;

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

一、Scrapy的安装

window:

a. pip3 install wheel
b. 下载twisted 
c. cmd切换到Twisted目录,执行 pip3 install Twisted‑17.1.0‑py36‑none-any.whl d. pip3 install scrapy

二、Scrapy的基本使用

1、新建一个文件day125:C:\Python\zh\day125,   切换至此目录下

2、创建project

cmd创建一个project,名称为xdb  ---在cmd中:

C:\Python\zh\day125>scrapy startproject xdb

执行上面命令后在day125中会自动生成一个名为xdb的项目,里面有两个文件:

 

 xdb文件中:

 

 文件说明:

  • spiders      爬虫目录,如:创建文件,编写爬虫规则
  • items.py    设置数据存储模板,用于结构化数据,如:Django的Model
  • middlewares.py 中间件
  • pipelines    数据处理行为,如:一般结构化的数据持久化
  • settings.py 配置文件,如:递归的层数、并发数,延迟下载等 

3、创建爬虫项目:

切换至xdb目录下,在cmd中:

C:\Python\zh\day125\xdb>scrapy genspider chouti chouti.com

打开chouti.py:

#chouti.py
import scrapy

class ChoutiSpider(scrapy.Spider):
    name = 'chouti'
    allowed_domains = ['chouti.com']
    start_urls = ['http://chouti.com/']

    def parse(self, response):
        pass

 4、启动爬虫

scrapy crawl chouti

三、scrapy示例:获取抽屉新闻

为了操作方便,在pycharm找到xdb项目并打开

 

 chouti.py

 

 在cmd中启动项目:

 

 --nolog表示不打印日志。

-----------------------------------------------------------------------------------

爬取chouti新闻时: 

chouti.py

import scrapy
from scrapy.http.response.html import HtmlResponse
# import sys,os,io
# sys.stdout=io.TextIOWrapper(sys.stdout.buffer,encoding='gb18030')
#如果项目启动出错可以开打上面两条命令

class ChoutiSpider(scrapy.Spider):
    name = 'chouti'
    allowed_domains = ['chouti.com']
    start_urls = ['http://chouti.com/']

    def parse(self, response):
        # print(response,type(response)) # 对象
        # print(response.text)
        """
        from bs4 import BeautifulSoup
        soup = BeautifulSoup(response.text,'html.parser')
        content_list = soup.find('div',attrs={'id':'content-list'})
        """

        # xpath:帮助我们找标签,它是HTML内置的解析器
        # //表示去当前html子孙中找div并且id=content-list
        # /表示去儿子里面去找div标签
        f = open('news.log', mode='a+')  #打开一个文件,a+:追加
        item_list = response.xpath('//div[@id="content-list"]/div[@class="item"]')


        for item in item_list:
            text = item.xpath('.//a/text()').extract_first() #取第一个a标签的文本内存
            href = item.xpath('.//a/@href').extract_first()  #取第一个a标签的属性
            print(href,text.strip())
            f.write(href+'\n') #写入爬取的内容
        f.close()

        #上面写入的是第一页的数据,还需要跳转到第二页、第三页写入第二页数据
        #找到分页的所有页面
        page_list = response.xpath('//div[@id="dig_lcpage"]//a/@href').extract()
        for page in page_list:
            from scrapy.http import Request
            page = "https://dig.chouti.com" + page
            yield Request(url=page,callback=self.parse) # https://dig.chouti.com/all/hot/recent/2
            #通过yield Request()告诉scrapy再次向指定的url发起请求

 其它:

"""

"""


# 原来
"""
import requests

url_list = ['http://www.baidu.com', 'http://www.baidu.com', 'http://www.baidu.com', ]

for item in url_list:
    response = requests.get(item)
    print(response.text)

"""

# 现在
"""
非阻塞,不等待; 我向贝贝、高件套、小东北发起连接请求时候,不等连接再去连下一个,而是发送一个只会,马上发送下一个。

    import socket 
    sk = socket.socket()
    sk.setblocking(False)
    sk.connect((1.1.1.1,80))
    
    import socket 
    sk = socket.socket()
    sk.setblocking(False)
    sk.connect((1.1.1.2,80))
    
    import socket 
    sk = socket.socket()
    sk.setblocking(False)
    sk.connect((1.1.1.3,80))

异步,回调; 我帮助龙泰、呼呼、刘淞找到想要的人只会,我会主动通知他们。
    def callback(contents):
    print(contents)
事件循环; 我,我一直在循环三个socket任务(即:贝贝、高件套、小东北),检查他三个状态:是否连接成功;是否返回结果。


总结:
    官方:基于事件循环的异步非阻塞模块。
    白话:一个线程同时可以向多个目标发起Http请求。
    
"""

from twisted.web.client import getPage, defer
from twisted.internet import reactor

# 第一部分:代理开始接收任务
def callback(contents):
    print(contents)

deferred_list = [] # [(龙泰,贝贝),(刘淞,宝件套),(呼呼,东北)]
url_list = ['http://www.bing.com', 'https://segmentfault.com/','https://stackoverflow.com/' ]
for url in url_list:
    deferred = getPage(bytes(url, encoding='utf8')) # (我,要谁)
    deferred.addCallback(callback)
    deferred_list.append(deferred)


# # 第二部分:代理执行完任务后,停止
dlist = defer.DeferredList(deferred_list)

def all_done(arg):
    reactor.stop()

dlist.addBoth(all_done)

# 第三部分:代理开始去处理吧
reactor.run()
Twisted

 

posted @ 2020-07-12 17:25  zh_小猿  阅读(231)  评论(0编辑  收藏  举报