后端爬虫开发

一:前期准备

软件安装:
安装anaconda
新建python工作环境
安装VS code
在anaconda中新建的环境中打开命令行,新建scrapy项目

scrapy startproject xxxx

前期准备完成

二:项目编写

1.知识储备

scrapy的基础知识
正则表达式
网站基础知识
数据库基础知识
xpath或css的基础知识

2.项目开发

  • 新建spider

在anaconda中新建的环境中打开命令行

scrapy genspider xxxxx xxxxx.com

另外,此处小技巧,直接在命令行中使用 code .可以直接打开VScode

  • 创建项目启动文件
    在项目根目录下创建main.py,文件具体内容大同小异,具体如下:
from scrapy import cmdline
cmdline.execute('scrapy crawl jobbole'.split())
  • 项目流程


    项目流程
2.1爬取列表页

一般来讲,大多数的网站的设计模式是先有一个列表页,可以从列表页进入每条文章的详情页,所以,对于爬虫来说,要先取得列表页的地址,对于可以直接取得网页源代码的网站,直接爬取到列表的父标签。以jobbole为例:



此处使用xpath或者css选择到

//div[@class='post floated-thumb']//div[@class='post-thumb']//a
2.2爬取详情页

上面的xpath在页面中可以提取到多个节点,节点间结构相似,可以对节点进行处理,提取出关键信息。

for post_node in post_nodes:
            post_url = post_node.xpath("./@href").extract_first("")
            img_url = post_node.xpath(".//img/@src").extract_first("")
            yield Request(url=parse.urljoin(response.url, post_url), meta={"img_url": img_url}, callback=self.parse_detail)

yield语句可以理解为转发提取的信息,参数callback是回调函数,提取到的数据经过request转入新函数,

def parse_detail(self, response):

        item_loader = ArticleItemLoader(item=JobboleSpiderItem(), response=response)
        img_url = response.meta.get("img_url", "")
        item_loader.add_xpath("title", "//div[@class='entry-header']/h1/text()")
        item_loader.add_xpath("create_date", "//p[@class='entry-meta-hide-on-mobile']/text()")
        item_loader.add_xpath("praise_nums", "//span[contains(@class, 'vote-post-up')]/h10/text()")
        item_loader.add_xpath("fav_nums", "//span[contains(@class, 'bookmark-btn')]/text()")
        item_loader.add_xpath("comment_nums", "//a[@href='#article-comment']/span/text()")
        item_loader.add_xpath("content", "//div[@class='entry']")
        item_loader.add_xpath("tags", "//p[@class='entry-meta-hide-on-mobile']/a/text()")
        item_loader.add_value("page_url", response.url)
        item_loader.add_value("page_url_id", get_md5(response.url))
        item_loader.add_value("img_url", [img_url])
        arcticItem = item_loader.load_item()

        yield arcticItem
2.3下一页
next_url = response.css(".next.page-numbers::attr(href)").extract_first("")
if next_url:
            yield Request(url=parse.urljoin(response.url, next_url), callback=self.parse)

下一页存在,则把下一页的地址传入列表页的函数,重复次过程

2.3数据存取

数据可以经pipelines处理后,存入数据库,具体的方法可以查看官方文档,此处以Mongodb为例:

    collection_name = 'artic'

    def __init__(self, mongo_uri, mongo_db):
        self.mongo_uri = mongo_uri
        self.mongo_db = mongo_db

    @classmethod
    def from_crawler(cls, crawler):
        return cls(mongo_uri=crawler.settings.get('MONGO_URI'), mongo_db=crawler.settings.get('MONGO_DB'))

    def open_spider(self, spider):
        self.client = pymongo.MongoClient(self.mongo_uri)
        self.db = self.client[self.mongo_db]

    def close_spider(self, spider):
        self.client.close()

    def process_item(self, item, spider):
        self.db[self.collection_name].insert_one(dict(item))
        return item

数据库地址与数据库配置在setting文件中

三:项目小结

大体的框架如上,具体的项目细节自己摸索,
item不直接处理,使用了item_loader,直接简洁。
在item中和pipelines中,自定义了新的类。要在setting中进行配置,

你可能感兴趣的:(后端爬虫开发)