Scrapy----安装及基础案例

一、安装步骤

1 在所需要的路径中安装
第一步安装lxml 利用pip install lxml
lxml是个非常有用的python库,它可以灵活高效地解析xml,与BeautifulSoup、requests结合,是编写爬虫的标准姿势。


2第二步安装zope.interface pip install zope.interface
Python支持多继承,但是不支持接口,zope.inteface是其三方的接口实现库,在twisted中有大量使用


3 twisted pip install twisted
Twisted是用Python实现的基于事件驱动的网络引擎框架。Twisted诞生于2000年初他支持很多种协议,包括UDP,TCP,TLS和其他应用层协议,比如HTTP,SMTP,NNTM,IRC,XMPP/Jabber。 非常好的一点是twisted实现和很多应用层的协议,开发人员可以直接只用这些协议的实现。其实要修改Twisted的SSH服务器端实现非常简单。很多时候,开发人员需要实现protocol类。
一个Twisted程序由reactor发起的主循环和一些回调函数组成。当事件发生了,比如一个client连接到了server,这时候服务器端的事件会被触发执行。

再次之前,需要安装Twisted-18.4.0-cp36-cp36m-win_amd64.whl和vc_redist15.x86.exe,我的网盘有


4 第四步安装pyOpenSSL pip install pyOpenSSL


5第五步安装pywin32 pip install pywin32 出错
pywin32是一个Python库,为python提供访问Windows API的扩展,提供了齐全的windows常量、接口、线程以及COM机制等等
下载地址:https://sourceforge.net/projects/pywin32/files/pywin32/
下载后双击安装
若之后仍显示cannot import name ‘_win32stdio‘
则cmd中运行pip install pypiwin32


6 第六步安装Scrapy pip install scrapy
scrapy 不同于简单的单线程爬虫,采用scrapy框架写python爬虫需要生成许多个文件,这一件类似于java里面的web框架,许多工作都可以通过一些配置文件来完成。


二、爬取流程

●新建项目 (Project):新建一个新的爬虫项目
●明确目标(Items):明确你想要抓取的目标
●制作爬虫(Spider):制作爬虫开始爬取网页
●存储内容(Pipeline):设计管道存储爬取内容


三、爬虫编写常用知识点

具体见http://www.w3school.com.cn/xpath/index.asp

3.1常用语法

●xpath():返回一系列的selectors,每一个select表示一个xpath参数表达式选择的节点
●css():返回一系列的selectors,每一个select表示一个css参数表达式选择的节点
●extract():返回一个unicode字符串,为选中的数据
●re():返回一串一个unicode字符串,为使用正则表达式抓取出来的内容
all_a=selector.xpath("//a[@download]").re(reg)
●在xpath方法中,获取文中的文字就要../text()加在最后

3.2setting.py中存储的格式

Scrapy 自带了 Feed 输出,并且支持多种序列化格式(serialization format)及存储方式(storage backends)。
其自带支持的类型有:
JSON FEED_FORMAT: json 大数据量情况下使用 JSON
JSON lines FEED_FORMAT: jsonlines
CSV FEED_FORMAT: csv
XML FEED_FORMAT: xml

扫描二维码关注公众号,回复: 1585629 查看本文章
3.3css用法
3.4xpath用法
3.4.1xpath选取节点
表达式 描述
nodename 选取此节点的所有子节点。
/ 从根节点选取。
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
. 选取当前节点。
.. 选取当前节点的父节点。
@ 选取属性。
3.4.2xpath路径及表达式-1
路径表达式 结果
bookstore 选取 bookstore 元素的所有子节点。
/bookstore 选取根元素 bookstore。注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径!
bookstore/book 选取属于 bookstore 的子元素的所有 book 元素。
//book 选取所有 book 子元素,而不管它们在文档中的位置。
bookstore//book 选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。
//@lang 选取名为 lang 的所有属性。
3.4.3xpath路径及表达式-2
路径表达式 结果
/bookstore/book[1] 选取属于 bookstore 子元素的第一个 book 元素。
/bookstore/book[last()] 选取属于 bookstore 子元素的最后一个 book 元素。
/bookstore/book[last()-1] 选取属于 bookstore 子元素的倒数第二个 book 元素。
/bookstore/book[position()<3] 选取最前面的两个属于 bookstore 元素的子元素的 book 元素。
//title[@lang] 选取所有拥有名为 lang 的属性的 title 元素。
//title[@lang=’eng’] 选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。
/bookstore/book[price>35.00] 选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。
/bookstore/book[price>35.00]/title 选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。
3.4.4xpath路径及表达式-3
路径表达式 结果
/bookstore/* 选取 bookstore 元素的所有子元素。
//* 选取文档中的所有元素。
//title[@*] 选取所有带有属性的 title 元素。
3.4.5选取若干路径
路径表达式 结果
//book/title | //book/price 选取 book 元素的所有 title 和 price 元素。
//title | //price 选取文档中的所有 title 和 price 元素。
/bookstore/book/title | //price 选取属于 bookstore 元素的 book 元素的所有 title 元素,以及文档中所有的 price 元素。
3.4.6选取未知节点
通配符 描述
* 匹配任何元素节点。
@* 匹配任何属性节点。
node() 匹配任何类型的节点。
#

四、爬取梦幻西游中连接的信息

(1)命令:

scrapy startproject menghuan

(2)打开新窗口,
在items文件中写入类,用来处理爬虫的数据,用来存放数据

import scrapy
from scrapy import Field,Item

class MenghuanItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    name = Field()
    src = Field()
    spe=Field()
    pass

(3)在Spiders文件中写入爬虫的类(css方法)

import scrapy
from scrapy.selector import Selector
from scrapy.spiders import CrawlSpider
from menghuan.items import MenghuanItem

class Menghuan(CrawlSpider):
    name = "menghuange"
    start_urls = ["http://xyq.163.com/download/down_music.html"]
    def parse(self, response):
        item = MenghuanItem()
        selector = Selector(response)
        parent = selector.css('#dLeft .g-clr section')[0].css('tbody tr')

        for i in parent:
            td=i.xpath("td/text()").extract()
            print(td)
            href=i.xpath("td/a/@href").extract()
            print(href)
            item['name'] = td[0]
            item['src'] = href
            item['spe'] = td[1]
            yield item

(4)在setting文件中写代理或者ip

USER_AGENT='Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/536.5 (KHTML, like Gecko) '
'Chrome/19.0.1084.54 Safari/536.5'
FEED_URI=u'file:///D:/pycharm2017.3.2/work/scrapy 0608/megnhuan/menghuan.csv'
FEED_FORMAT = 'CSV'

(5)新建一个主要运行的文件

from scrapy import cmdline
cmdline.execute("scrapy crawl menghuange".split())   #在此运行文件是爬虫的文件

五、爬取豆瓣的网页的电影信息

(1)命令:

scrapy startproject doubanTest

(2)打开新窗口,
在items文件中写入类,用来处理爬虫的数据,用来存放数据

import scrapy
from scrapy import Item, Field

class DoubantuItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    title=Field()  #电影名称
    movieInfo = Field()  # 电影介绍
    star = Field()#评分
    critical = Field()#评分人数
    quote = Field()#经典的话

    pass

(3)在Spiders文件中写入爬虫的类(xpath方法)

import scrapy
from scrapy.spiders import CrawlSpider
from scrapy.http import Request
from scrapy.selector import Selector
from doubanTU.items import DoubantuItem  #导入类
import re

class douban(CrawlSpider):
    name="doubantext"        #文件名与name一致
    start_urls=["https://movie.douban.com/top250"]
    def parse(self,respone):
        item=DoubantuItem()    #items中的类
        seletor=Selector(respone)   #处理返回结果
        Movies=seletor.xpath('//div[@class="info"]')    #选取所有class="info"的内容
        #提取所有的信息
#####################在读取网页内容的时候与编程方式不一样,在这里,1 就是第一个,4就是第四个
        for eachMovie in Movies:
            fullTitle=eachMovie.xpath("div[@class='hd']/a/span[@class='title'][1]/text()").extract()
            star=eachMovie.xpath("div[@class='bd']/div[@class='star']/span[2]/text()").extract()
            movieInfo = eachMovie.xpath("div[@class='bd']/p[1]/text()").extract()
            craticalStr=eachMovie.xpath("div[@class='bd']/div[@class='star']/span[4]/text()").extract()[0]
            critical=re.sub("\D","",craticalStr)    # 使用空字符串代替"\D"
            quote=eachMovie.xpath("p[@class='quote']/span[@class='inq']/text()")
            if quote:
                print("+++++++++++++quote++++++++++++++++",quote)
                quote=quote[0]
            else:
                quote="无评论"

            item["title"]=fullTitle
            item["movieInfo"]=movieInfo[0].strip()
            item["star"]=star
            item["critical"]=critical
            item["quote"]=quote

            yield item  # 提交给item pipeline

(4)在setting文件中写代理或者ip

USER_AGENT='Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/536.5 (KHTML, like Gecko) '
'Chrome/19.0.1084.54 Safari/536.5'
FEED_URI=u'file:///D:/pycharm2017.3.2/work/scrapy 0608/doubanTU/douban.csv'
FEED_FORMAT = 'CSV'
# Crawl responsibly by identifying yourself (and your website) on the user-agent
#USER_AGENT = 'doubanTU (+http://www.yourdomain.com)'

(5)新建一个主要运行的文件

from scrapy import cmdline
cmdline.execute("scrapy crawl doubantext".split())

猜你喜欢

转载自blog.csdn.net/sakura55/article/details/80644996