您的位置:首页 > 理论基础 > 计算机网络

网络爬虫Scrapy框架入门

2017-09-06 15:00 204 查看
一、安装Scrapy

首先是安装Scrapy,当然还是pip大法了。

但是安装过程中会报错,原因是缺少pywin32,可下载相对应python版本的。下载链接

下载之后点击.exe程序运行安装。安装完pywin32,便可以安装Scrapy。pip install Scrapy

之后可以验证一下:

打开cmd命令窗口

没报错就是OK了!

二、Scrapy的使用

这个框架与BeautifulSoup不一样。它需要在命令行中创建工程,然后在命令行中通过执行命令开始运行。

1、新建工程

你可以先cd进入你的项目文件夹

scrapy startproject WLSpider

这里的WLSpider为工程名,你可以随意命名。他会在你的项目文件夹下创建一个新的名为WLSpider的文件夹。

目录结构如下:

└── WLSpider
     ├──WLSpider 
     │ ├── __init__.py 
     │ ├── items.py              #设置数据存储模板,用于结构化数据。一般模版为python字典类似
     │ ├── middlewares.py      
     │ ├── pipelines.py         #对爬取的页面的数据进行处理的行为
     │ ├── settings.py          #爬虫相关的配置信息
     │ └── spiders               #在这个文件夹下创建一个新的py文件,用于编写爬虫规则
     │       └── __init__.py 
     └── scrapy.cfg            #项目的配置信息,主要为Scrapy命令行工具提供一个基础的配置信息。

2、添加一个爬虫(编写爬虫规则)

在spiders 文件夹下创建一个名为LiuYiFei_spider.py的文件。没错,LiuYiFei就是刘亦菲!我们现在要在豆瓣刘亦菲的图片主页上(https://movie.douban.com/celebrity/1049732/photos/?type=C&start=0&sortby=vote&size=a&subtype=a)爬取刘亦菲的图片链接。并将图片链接保存在一个txt文本文件中。
在items.py文件中添加以下内容:
# -*- coding: utf-8 -*-

# Define here the models for your scraped items
#
# See documentation in:
# http://doc.scrapy.org/en/latest/topics/items.html 
from scrapy import Item,Field

class LiuyifeiimageItem(Item):
# define the fields for your item here like:
# name = scrapy.Field()
ImageAddress=Field()
pass
在这里我们定义了一个名为ImageAddress的条目(Item),用来存储图片的链接。Item像是一个容器,用来装载你所抓取的页面数据。工作方式有点像python的字典。你抓取的数据有几个类型你就可以定义几个Item。(例如文章标题、图片标题、姓名等都是不同类型)

在LiuYiFei_spider.py中添加以下内容:
import scrapy
from scrapy.http import Request
from scrapy.selector import Selector
from liuyifeiImage.items import LiuyifeiimageItem
from scrapy import Spider
import urllib
import re
import os

class LiuYiFei(Spider):
"""docstring for LiuYiFei"""
name="liuyifei"
allowed_domains=["https://movie.douban.com/celebrity/1049732/"]
start_urls=[]
f=open('liuyifei_pic_address.txt','w')
for i in range(0,1160,40):
start_urls.append('http://movie.douban.com/celebrity/1049732/photos/?type=C&start=%d&sortby=vote&size=a&subtype=a' % i)

def parse(self,response):
hxs=Selector(response)    #创建查询对象
sites=hxs.xpath('//ul[@class="poster-col4 clearfix"]/li/div/a/img/@src').extract()
items=[]
for site in sites:
site=site.replace('thumb','photo')
self.f.write(site)
self.f.write('\r\n')
item=LiuyifeiimageItem()
item['ImageAddress']=site
items.append(item)
return items
在这个class类中,你需要继承Spider类。类中有三个必须有的属性或方法:
name:爬虫的名字。必须唯一!你创建了这只小爬虫,你给它起个名字方便以后使用它。
start_urls:爬虫开始爬的 URL 列表,爬虫从这些URL页面开始抓取数据。这里的start_urls初始为空,是因为照片太多,存在多个页面,所以需要append()方法来添加。大家可以观察一下:
https://movie.douban.com/celebrity/1049732/photos/?type=C&start=0&sortby=vote&size=a&subtype=a这是第一页图片,https://movie.douban.com/celebrity/1049732/photos/?type=C&start=40&sortby=vote&size=a&subtype=a 这是第二页图片,https://movie.douban.com/celebrity/1049732/photos/?type=C&start=80&sortby=vote&size=a&subtype=a 这是第三页图片。看红的地方(0,40,80)大家可以发现这个规律,因此采用range(0,1160,40),这里1160并没有到最后一页,你可以改成更大的数。

parse:爬虫的方法,参数response 为每一个
URL 传回的 应答包response ,response 将会是 parse 方法的唯一的一个参数,这个方法负责解析返回的数据、解析为 Item 或 URL,如果为URL,便可以进一步抓取。
allowed_domains:这个属性并不强制,但是一般加上。这个属性为允许运行的URL,意思是爬虫在这链接里爬取,这里为: ["https://movie.douban.com/celebrity/1049732/"]
  这个链接是豆瓣刘亦菲的主页,是图片主页的上一级,从链接本身也可以看出。

liuyifei_pic_address.txt这个文本是存储图片链接的文本文件。open()方法打开这个文件,如果没有这个文件,就创建一个文件。这条语句在python基础教程关于文件的部分可以看到。

关于xpath方法,是一个选择器,在python2的版本中是select,但是python3中,用xpath代替。Selector也是python3中是新出现的代替(python2中为HtmlXPathSelector)
xpath的参数有一定的规则,以li标签为例:
//li   #查询所有的li标签
//ul[@class="poster-col4 clearfix"] #查询所有class为poster-col4 clearfix的ul标签
//ul[@class="poster-col4 clearfix"]//li #查询所有class为poster-col4 clearfix的ul标签下的所有li标签(在ul的后代标签中查找)
//ul[@class="poster-col4 clearfix"]/li  #查询所有class为poster-col4 clearfix的ul标签下的li儿子标签(在ul的儿子标签中查找)
/img/@src   #查找img标签的src属性
extract()方法提取内容,例如src属性的内容。

3、运行爬虫
在cmd命令行中输入
scrapy crawl liuyifei         (liuyifei为爬虫的名字)

运行结果会报错:
[scrapy.core.engine] DEBUG: Crawled (403) <GET ht..............................
403响应是因为豆瓣设置了防爬虫措施
解决方法是:
在WLSpider/WLSpider/settings.py文件中修改:
# Crawl responsibly by identifying yourself (and your website) on the user-agent
#USER_AGENT = 'liuyifeiImage (+http://www.yourdomain.com)'
USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36'
这样就OK了!
你会文件夹下发现一个名为liuyifei_pic_address.txt的文本文件,内容为:

修改USER_AGENT的方法可以绕过基本的防爬虫措施,但是如果更高级的爬虫措施,还要修改更多。本人刚接触爬虫,所以懂得不多,还希望广大网友多多交流!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: