日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python爬虫-初步使用Scrapy分布式爬虫(爬取mcbbs整合包保存名称及主要mod),大爱MC

發(fā)布時(shí)間:2024/4/11 python 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python爬虫-初步使用Scrapy分布式爬虫(爬取mcbbs整合包保存名称及主要mod),大爱MC 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
  • 首先介紹一下scrapy。
    • Scrapy一個(gè)開源和協(xié)作的框架,是為了頁(yè)面抓取所設(shè)計(jì)的,使用它可以快速、簡(jiǎn)單、可擴(kuò)展(通過(guò)中間件)的方式從網(wǎng)站中提取所需的數(shù)據(jù)。
    • 工作流程如下
      • ?Scrapy Engine是scrapy的核心,負(fù)責(zé)數(shù)據(jù)流的管理。Spiders(爬蟲)發(fā)出Requests請(qǐng)求,請(qǐng)求經(jīng)由Scrapy Engine傳遞給Scheduler(調(diào)度器),Scheduler通過(guò)Downloader Middlewares(下載器中間件)傳遞Requests給Downloader(下載器),Downloader根據(jù)Requests從網(wǎng)絡(luò)上下載數(shù)據(jù),并給出結(jié)果Responses(這是爬取內(nèi)容的結(jié)果),隨后Downloader通過(guò)Spider Middlewares(爬蟲中間件)將Response交給Spiders分析,Spiders分析得到Items交給Item Pipeline(管道)。
      • 這里的Spider和Item Pipeline根據(jù)用戶需求自行編寫。(中間件也可以自行編寫)
      • 具體返回值設(shè)計(jì)可以參照官方中文文檔:http://scrapy-chs.readthedocs.io/zh_CN/0.24/intro/tutorial.html

?

?

  • 圖片來(lái)自官方參考文檔。
  • 本次測(cè)試為爬取mcbbs整合包模塊的帖子列表,并且獲取每個(gè)帖子的鏈接,訪問該鏈接頁(yè)面并且獲得主要內(nèi)容標(biāo)簽內(nèi)的文本,以“標(biāo)題? : 主要mod”存入txt文本文件。
  • 創(chuàng)建項(xiàng)目,mcbbs。

  • conda activate spider :激活一個(gè)python虛擬環(huán)境叫做spider,且spider這個(gè)虛擬環(huán)境目錄下已經(jīng)安裝了scrapy。如何創(chuàng)建虛擬解釋器環(huán)境,并且安裝scrapy參見我的博客 :https://blog.csdn.net/zhouchen1998/article/details/81382006
  • 創(chuàng)建成功后在對(duì)應(yīng)位置生成項(xiàng)目文件夾,用pycharm打開,文件結(jié)構(gòu)如下:

  • 其中PackSpider為自定義爬蟲。
  • 1.首先,設(shè)置settings.py。
    • 設(shè)置延時(shí)之類的,生成的文件里都有但是注釋了,改過(guò)來(lái)就OK。
BOT_NAME = 'mcbbs'SPIDER_MODULES = ['mcbbs.spiders'] NEWSPIDER_MODULE = 'mcbbs.spiders' ITEM_PIPELINES = {'mcbbs.pipelines.McbbsPipeline': 1, } STORE = 'D:\get.txt'ROBOTSTXT_OBEY = False DOWNLOAD_DELAY = 1

?

  • 2.完成Item書寫。
    • 因?yàn)槲乙4嫣用Q和主要mod內(nèi)容,名稱獲取頁(yè)面元素就ok,但是主要mod則是通過(guò)獲得元素的鏈接進(jìn)入帖子獲取主要內(nèi)容,并且保存,所以item設(shè)計(jì)如下。
    • items.py

?

import scrapyclass McbbsItem(scrapy.Item):# define the fields for your item here like:# name = scrapy.Field()link_url = scrapy.Field()dir_name = scrapy.Field()dir_content = scrapy.Field()
  • 3.寫你的爬蟲PackSpider.py(這里看清結(jié)構(gòu)和繼承)
    • 自定義爬蟲必須繼承Spider
    • 因?yàn)轫?xiàng)目簡(jiǎn)單,不詳細(xì)注釋了。
import scrapy from scrapy import Selector from mcbbs.items import McbbsItem ''' 爬取mcbbs整合包區(qū)塊的整合包貼名,并且通過(guò)xpath或者re(正則表達(dá)式)進(jìn)入相關(guān)鏈接爬取所含主要mod'''class PackSpider(scrapy.Spider):name = 'mc_pack'def __init__(self):# 帖子域名self.server_link = 'http://www.mcbbs.net'self.allowed_domains = ['www.mcbbs.net']str1 = 'http://www.mcbbs.net/forum.php?mod=forumdisplay&fid=170&page='# 產(chǎn)生前十列的所有鏈接self.start_urls = [(str1 + str(item)) for item in range(2, 51)]def start_requests(self):for item in self.start_urls:yield scrapy.Request(url=item, callback=self.parse1)# 解析內(nèi)容獲得每個(gè)帖子的地址def parse1(self, response):hxs = Selector(response)items = []# 獲取鏈接urls = hxs.xpath(r'//a[@onclick="atarget(this)"]/@href').extract()# 獲取帖子名稱dir_names = hxs.xpath(r'//a[@onclick="atarget(this)"]/text()').extract()for index in range(len(urls)):item = McbbsItem()item["link_url"] = self.server_link + "/"+ urls[index]item["dir_name"] = dir_names[index]items.append(item)# 根據(jù)每個(gè)帖子鏈接,發(fā)送Request請(qǐng)求,傳遞itemfor item in items:yield scrapy.Request(url=item["link_url"], meta={"item": item}, callback=self.parse2)def parse2(self, response):item = response.meta['item']hxs = Selector(response)context = hxs.xpath(r'//tbody/tr[last()-2]/td/text()').extract()item["dir_content"] = contextyield item

?

  • 4.完成pipelines.py,數(shù)據(jù)落地。
# -*- coding: utf-8 -*-# Define your item pipelines here # # Don't forget to add your pipeline to the ITEM_PIPELINES setting # See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html from mcbbs import settings from scrapy import Request import requests import osclass McbbsPipeline(object):def process_item(self, item, spider):with open(settings.STORE, 'a') as f:f.write(item['dir_name']+" : ")f.write(str(item['dir_content'])+"\n")return item
  • 5.注意,如果你用的pycharm來(lái)項(xiàng)目編輯,那么必須給一個(gè)入口模塊。同時(shí)scrapy是異步的爬取順序不是輸入順序。
    • main.py
    • 其中mc_pack就是spider里面定義的name。
from scrapy import cmdline if __name__ == '__main__':cmdline.execute('scrapy crawl mc_pack'.split())
  • ?運(yùn)行結(jié)果

總結(jié)

以上是生活随笔為你收集整理的python爬虫-初步使用Scrapy分布式爬虫(爬取mcbbs整合包保存名称及主要mod),大爱MC的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。