Scrapy框架学习笔记

环境配置

Anaconda3
以管理员身份运行anaconda prompt
conda activate 环境名
conda intall scrapy

创建scrapy项目

打开prompt终端
conda activate 环境名
cd 想将项目放置在的某个文件目录
# 创建项目
scrapy startproject 项目名称(尽量路径都用英文)
cd spiders目录下
# 生成爬虫文件
scrapy genspider 爬虫文件名 页面的域名

运行scrapy文件

# 支持csv,xml,json
scrapy crawl 爬虫文件名 -o douban.csv

爬虫文件模板

import scrapy


class SpiderSpider(scrapy.Spider):
    name = "spider"
    allowed_domains = ["movie.douban.com"]
    #起始页面
    start_urls = ["http://movie.douban.com/top250"]
	
	# 指明response对象是Html对象
    def parse(self, response:HtmlResponse):
        selector=Selector(response)
        # 使用css解析页面,返回的仍然是Selector对象
        list_items=selector.css("ol.grid_view > li")
        for item in list_items:
            movie_item=ScrapyExerciseItem()
            movie_item['title']=item.css('.hd .title::text').extract_first()
            movie_item['rank']=item.css('.star > .rating_num::text').extract_first()
            movie_item['quote']=item.css('.quote .inq::text').extract_first()
            # 使用生成器
            yield movie_item

预先加载页面列表

重写start_requests方法,删除stat_urls属性,可以解决页面url不统一

# 起始页面
    # 重写了start_requests之后便不需要起始页面
    # start_urls = ["http://movie.douban.com/top250"]

    def start_requests(self):
        for page in range(10):
            # 一开始就直接给引擎生成十个页面
            # python字符串格式化,使用f作为前缀开启格式化,大括号中的值经过计算后填入字符串
            yield Request(url=f"http://movie.douban.com/top250?start={page*25}&filter=")

获取页面中的url并加载到爬虫引擎中

# 此种方法有缺陷,因为第一页的url可能有两种
        # 取出a标签的属性
        href_list=selector.css(".paginator a::attr(href)")
        for href in href_list:
             # 解决相对路径,拼接url
             url=response.urljoin(href.extract())
             # 将url交给引擎
             yield Request(url=url)

更改settings.py文件

设置不遵守robots协议

#在settings.py中找到这一项,注释掉或者设置为False
ROBOTSTXT_OBEY = False

更改User-Agent

#在settings.py中找到这一项,更改为页面对应的user-agent
USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36"

设置最大并发数量

#在settings.py中找到这一项,此数字一般为2的次方,不要随意设置
CONCURRENT_REQUESTS = 8

设置下载延迟

# 在settings.py中找到这一项,设置随机延迟
DOWNLOAD_DELAY = 3
# 设置随机化延迟下载
RANDOMIZE_DOWNLOAD_DELAY = True

设置items.py

在items.py里定义对象属性

import scrapy


class ScrapyExerciseItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    title=scrapy.Field()
    rank=scrapy.Field()
    quote=scrapy.Field()

在爬虫文件中导入items下的对象并创建

# 从根目录下导入自定义包中的对象
from scrapy_exercise.items import ScrapyExerciseItem
movie_item=ScrapyExerciseItem()

你可能感兴趣的:(scrapy,学习,python)