1、安装scrapy
pip3 install scrapy
2、打开terminal,cd 到想要创建程序的目录下
3、创建一个scrapy项目
在终端输入:scrapy startproject my_first_scrapy(项目名)
4、在终端输入:cd my_first_scrapy 进入到项目目录下
5、新建爬虫:
输入: scrapy genspider chouti chouti.com (chouti: 爬虫名称, chouti.com : 要爬取的网站的起始网址)
6、在pycharm中打开my_first_scrapy,就可以看到刚才创建的项目:
7、打开settings.py可以对项目相关参数进行设置,如设置userAgent:
8、打开chouti.py编写代码:
# -*- coding: utf-8 -*- """ 获取抽屉新热榜的标题和内容以及新闻地址保存到本地 """ import scrapy from scrapy.http import Request from scrapy.http.response.html import HtmlResponse from ..items import MyFirstScrapyItem class ChoutiSpider(scrapy.Spider): name = 'chouti' allowed_domains = ['chouti.com'] start_urls = ['http://chouti.com/'] def parse(self, response): # print(response, type(response)) # <class 'scrapy.http.response.html.HtmlResponse'> # print(response.text) # 解析文本内容, 提取标题和简介,地址 # 去页面中找id=content-list的div标签,再去这个div下找class=item的div items = response.xpath("//div[@id='content-list']/div[@class='item']") # "//"表示从html文件的根部开始找。"/"表示从儿子里面找。".//"表示相对的,及当前目录下的儿子里面找 for item in items: # 当前目录下找class=part1的div标签,再找div标签下的a标签的文本信息text(),并且只取第一个 # a标签后面可以加索引,表示取第几个a标签,如第一个:a[0] title = item.xpath(".//div[@class='part1']/a/text()").extract_first().strip() # 去掉标题两端的空格 href = item.xpath(".//div[@class='part1']/a/@href").extract_first().strip() # 取href属性 summary = item.xpath(".//div[@class='area-summary']/span/text()").extract_first() # print(1, title) # print(2, href) # print(3, summary) item_obj = MyFirstScrapyItem(title=title, href=href, summary=summary) # 实例化 yield item_obj # 将数据交给pipelines # 获取页码 page_list = response.xpath("//div[@id='dig_lcpage']//a/@href").extract() for url in page_list: url = "https://dig.chouti.com%s" % url yield Request(url=url, callback=self.parse) # 下载页面内容
9、打开items.py写代码:
# -*- coding: utf-8 -*- # Define here the models for your scraped items # # See documentation in: # https://doc.scrapy.org/en/latest/topics/items.html import scrapy class MyFirstScrapyItem(scrapy.Item): # define the fields for your item here like: # name = scrapy.Field() # 规则化:将要持久化的数据转化为某种格式 title = scrapy.Field() href = scrapy.Field() summary = scrapy.Field()
10、打开pipelines.py写代码:
""" 1、先去类中找from_crawler 有:执行且必须返回一个当前类的对象 没有:不执行,则去执行构造方法__init__(self)并返回一个对象 2、再去执行"对象.其他方法" """ class MyFirstScrapyPipeline(object): def __init__(self, file_path): self.f = None self.file_path = file_path @classmethod def from_crawler(cls, crawler): """ 初始化时,用于创建pipelines对象 :param crawler: :return: """ file_path = crawler.settings.get("CHOUTI_NEWS_PATH") # 存储文件的路径 return cls(file_path) def open_spider(self, spider): """ 打开文件 :param spider:提交数据过来的爬虫对象 :return: """ self.f = open(self.file_path, "a+", encoding="utf-8") def process_item(self, item, spider): """ :param item: 爬虫中yield过来的item对象 :param spider:提交数据过来的爬虫对象 :return: """ self.f.write(item["href"] + " ") self.f.flush() # 将内容强刷到硬盘进行保存 return item def close_spider(self, spider): """ 关闭文件 :param spider:提交数据过来的爬虫对象 :return: """ self.f.close()
11、在settings.py中找到 ITEM_PIPELINES进行设置,并设置存储下载的新闻存储的文件路径:
12、运行爬虫项目,在终端输入:
scrapy crawl chouti(会打印日志) 或者 scrapy crawl chouti --nolog (不打印日志)