环境配置
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()