关于使用scrapy框架编写爬虫以及Ajax动态加载问题、反爬问题解决方案

总的来说,Python爬虫所做的事情分为两个部分,1:将网页的内容全部抓取下来,2:对抓取到的内容和进行解析,得到我们需要的信息。

 

目前公认比较好用的爬虫框架为Scrapy,而且直接使用框架比自己使用requestsbeautifulsoupre包编写爬虫更加方便简单。

 

1、关于Scrapy框架

 

简介 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 其最初是为了 页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫。

 

官方文档地址  

 

Scrapy安装   pip install Scrapy

 

创建Scrapy项目 scrapy startproject scrapyspider(projectname)

该命令创建包涵下列内容的目录:

 

关于使用scrapy框架编写爬虫以及Ajax动态加载问题、反爬问题解决方案

这些文件分别是:

scrapy.cfg: 项目的配置文件。

scrapyspider/: 该项目的python模块。之后您将在此加入代码。

scrapyspider/items.py: 项目中的item文件。

scrapyspider/pipelines.py: 项目中的pipelines文件,用来执行保存数据的操作

scrapyspider/settings.py: 项目的设置文件。

scrapyspider/spiders/: 放置爬虫代码的目录。

 

  

 

 

 编写爬虫以爬取豆瓣电影TOP250为例展示一个完整但简单的Scrapy爬虫的流程

 

首先,在items.py文件中声明需要提取的数据,Item 对象是种简单的容器,保 存了爬取到得数据。 其提供了 类似于词典(dictionary-like) API以及用于声明可 用字段的简单语法。许多Scrapy组件使用了Item提供的额外信息: exporter根据 Item声明的字段来导出 数据、 序列化可以通过Item字段的元数据(metadata) 定义、trackref 追踪Item 实例来帮助寻找内存泄露 (see 使用 trackref 调试内 存泄露) 等等。

Item使用简单的class定义语法以及Field对象来声明。我们打开scrapyspider目录下的items.py文件写入下列代码声明Item

关于使用scrapy框架编写爬虫以及Ajax动态加载问题、反爬问题解决方案

为了创建一个爬虫,首先需要继承scrapy.Spider类,定义以下三个属性:

1、name : 用于区别不同的爬虫,名字必须是唯一的。

2、start_urls: 包含了Spider在启动时进行爬取的url列表。

3、parse() spider的一个函数。 被调用时,每个初始URL完成下载后生成的 Response 对象将会作为唯一的参数传递给该函数,然后解析提取数据。

 

 

scrapyspider/spiders目录下创建douban_spider.py文件,并写入初步的代码:

 

from scrapy import Request

from scrapy.spiders import Spider

from scrapyspider.items import DoubanMovieItem

 

 

class DoubanMovieTop250Spider(Spider):

    name = 'douban_movie_top250'

    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36',}#设置请求头文件,模拟浏览器访问(涉及反爬机制)

 

    def start_requests(self):#该函数定义需要爬取的初始链接并下载网页内容

        url = 'https://movie.douban.com/top250'

        yield Request(url, headers=self.headers)

 

    def parse(self, response):

        item = DoubanMovieItem()

        movies = response.xpath('//ol[@class="grid_view"]/li') #使用xpath对下载到的网页源码进行解析

        for movie in movies:

            item['ranking'] = movie.xpath(

                './/div[@class="pic"]/em/text()').extract()[0]

            item['movie_name'] = movie.xpath(

                './/div[@class="hd"]/a/span[1]/text()').extract()[0]

            item['score'] = movie.xpath(

                './/div[@class="star"]/span[@class="rating_num"]/text()'

            ).extract()[0]

            item['score_num'] = movie.xpath(

                './/div[@class="star"]/span/text()').re(ur'(\d+)人评价')[0]

            yield item

        next_url =  response.xpath('//span[@class="next"]/a/@href').extract() #解析得到下一页的链接

        if next_url:

            next_url = 'https://movie.douban.com/top250' + next_url[0]

            yield Request(next_url, headers=self.headers) #下载下一页的网页内容

 

运行爬虫 在项目文件夹内打开cmd运行下列命令:

 

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzfsfw.html